参考地址:https://www.cnblogs.com/qq4004229/archive/2013/01/30/2882409.html

一、需求描述

(1)用代码生成动态链接库

(2)用C#代码调用动态链接库

二、生成动态链接库

(1)新建类库

(2)添加WelcomeInfo类

代码如下(仅供测试用,例子很简单):

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace GenerateDLL
{
public class WelcomeInfo
{
public string ShowMsg(string name)
{
string str = "welcome " + name;
return str;
}
}
}

(3)生成DLL动态链接库

生成的dll在这里啦

二、c#调用dll

(1)新建一个控制台程序

(2)方法一

             Assembly assembly = Assembly.LoadFile("E:/haoStudy/GenerateDLL/GenerateDLL/bin/Debug/GenerateDLL.dll");

             //获取类型,参数(命名空间+类)
Type type = assembly.GetType("GenerateDLL.WelcomeInfo"); //创建该对象的实例,object类型,参数(命名空间+类)
object instance = assembly.CreateInstance("GenerateDLL.WelcomeInfo"); //设置方法中的参数类型,Type[]类型;如有多个参数可以追加多个
Type[] params_type = new Type[];
params_type[] = Type.GetType("System.String");
//设置方法中的参数值;如有多个参数可以追加多个
Object[] params_obj = new Object[];
params_obj[] = "Lucy"; //执行ShowMsg方法
string str = type.GetMethod("ShowMsg", params_type).Invoke(instance, params_obj).ToString();
Console.WriteLine(str);
Console.Read();

(3)方法二

             Assembly assembly = Assembly.LoadFile("E:/haoStudy/GenerateDLL/GenerateDLL/bin/Debug/GenerateDLL.dll");
//获取类型,参数(命名空间 + 类)
Type typeDBHelpher = assembly.GetType("GenerateDLL.WelcomeInfo");
object oDBHelper = Activator.CreateInstance(typeDBHelpher);
//需要调用的方法名
MethodInfo method = typeDBHelpher.GetMethod("ShowMsg");
//参数集合
object v = method.Invoke(oDBHelper, new object[] { "Lucy" });
string str = v.ToString();
Console.WriteLine(str);
Console.Read();

说明:两个方法大同小异,只是个别写法不一样,我个人更喜欢用第一种方法,感觉思路更清晰。

(3)效果

三、调用dll一次之后,就不能进行调用了,提示dll被占用的解决方案

             //Assembly assembly = Assembly.LoadFile("E:/haoStudy/GenerateDLL/GenerateDLL/bin/Debug/GenerateDLL.dll");
//此处改成这种方式即可
byte[] byteDLL = System.IO.File.ReadAllBytes("E:/haoStudy/GenerateDLL/GenerateDLL/bin/Debug/GenerateDLL.dll");
Assembly assembly = Assembly.Load(byteDLL);
//获取类型,参数(命名空间+类)
Type type = assembly.GetType("GenerateDLL.WelcomeInfo"); //创建该对象的实例,object类型,参数(命名空间+类)
object instance = assembly.CreateInstance("GenerateDLL.WelcomeInfo"); //设置方法中的参数类型,Type[]类型;如有多个参数可以追加多个
Type[] params_type = new Type[];
params_type[] = Type.GetType("System.String");
//设置方法中的参数值;如有多个参数可以追加多个
Object[] params_obj = new Object[];
params_obj[] = "Lucy"; //执行ShowMsg方法
string str = type.GetMethod("ShowMsg", params_type).Invoke(instance, params_obj).ToString();
Console.WriteLine(str);
Console.Read();

疑问:之前是在同一个页面既生成dll,又调用dll,就会出现“被占用”的错误,而且也无法多次调用同一dll。这次调用多次,也没有出现这个错误,不知是什么原因,有时间还得再实验下。

C#生成/调用动态链接库的更多相关文章

  1. Qt调用VC++生成的动态链接库

    Qt如何调用VC++生成的动态链接库?假设当前有VC++编译器生成的动态库文件testdll.h,testdll.lib和testdll.dll. testdll.h文件源码如下: #ifdef TE ...

  2. Qt不同版本编译器,调用VC++生成的动态链接库

    今天用QT编译生成的共享库自己却怎么都不能调用,查了N久后找到这个帖子,发现搞定了,记录一下 http://qiusuoge.com/12720.html Qt如何调用VC++生成的动态链接库?假设当 ...

  3. VS2010创建和调用动态链接库

    当我们开发一个产品的时候,我们并不想把源码公布给对方,除了给对方提供exe可执行文件外,我们还可以生成动态链接库,供程序调用,方便二次开发. 下面我将简单梳理一下如何创建和调用动态链接库,方便大家程序 ...

  4. VC++ 6.0如何创建与调用动态链接库

    原文:http://blog.csdn.net/wanghaihao_1/article/details/51098451 1.静态链接库与动态链接库区别: 静态链接库:lib中的指令被直接包含在最终 ...

  5. Java调用动态链接库so文件(传参以及处理返回值问题)

    刚来到公司,屁股还没坐稳,老板把我叫到办公室,就让我做一个小程序.我瞬间懵逼了.对小程序一窍不通,还好通过学习小程序视频,两天的时间就做了一个云开发的小程序,但是领导不想核心的代码被别人看到,给了我一 ...

  6. BCB如何编写,调用动态链接库DLL

    一 编写动态链接库DLL DLL简称动态链接库,是Windows中程序的重要组成部分.想象一下,一个程序需要多人共同完成开发,怎么个共同法?这时我们就要考虑把程序分为好几个模块,团队每一个成员开发一个 ...

  7. 跨平台开发 -- C# 使用 C/C++ 生成的动态链接库

    操作环境:Visual Studio 2017 如何实现 使用 C# 进行嵌入式开发? .NET Core 虽然实现了跨平台,但是不可能处处使用 C# 开发,就好像没人使用SQL开发安卓APP,每种语 ...

  8. python中使用ctypes调用MinGW生成的动态链接库(dll)

    关于gcc编译dll的我就不说了,网上举例一大堆,下面以g++为例. 假设有一个test.cpp文件如下: extern "C" { __declspec(dllexport) d ...

  9. C#调用C++生成的动态链接库DLL

    一.背景 由于要使用C#写app,所以要把C++生成的DLL在C#中调用,所以就涉及怎样去调用外部的dll问题. 二.C#调用外部DLL 首先先看下C#调用外部DLL的代码 using System. ...

随机推荐

  1. Docker在Centos 7上的部署

      Docker在Centos 7上的部署 方法1---开启centos 7上自带的 extras YUM源,然后 yum install docker来安装 安装前必须保证 Linux Kernel ...

  2. vmware-vmx.exe进程应该怎么杀掉

    如何解决VMware-vmx.exe无法彻底删除的问题 遇见的问题就是 虚拟机一直黑屏,强制关机之后,无法再次打开的问题. 显示:无法创建新虚拟机: 无法打开配置文件 以独占方式锁定此配置文件失败.另 ...

  3. 20180606模拟赛T4——数学游戏

    数学游戏 题目描述: 小T又发脑残了,没错,她又要求奇怪的东西,这次她想知道[X,Y]之间整数有多少可以表示成K个不同的B的幂的和形势.如\(x,y,k,b=15,20,2,2\),则有: \[17= ...

  4. Vim编辑器点滴积累

    Vim编辑器点滴积累 vim tab键空格数量控制 参考链接 临时:进入VIM,执行: :set tabstop=4 永久:编辑用户目录下.vimrc文件,添加:set tabstop=4 vim 安 ...

  5. 洛谷题解 P4392 【[BOI2007]Sound 静音问题】

    题目链接 其实写线段树的题还是比较的令我开心的因为不用脑子 怎么判断这题是要写线段树的? 1.暴力只能拿50分 2.这题是个绿题 3 .看数据范围 #include <cstdio> #i ...

  6. vue自学小demo----前端

    vue学习的小demo,实现简单的页面项目的增删 代码如下 <!DOCTYPE html> <html> <head> <meta charset=" ...

  7. java基础之 hashmap

    Hashmap是一种非常常用的.应用广泛的数据类型,最近研究到相关的内容,就正好复习一下.网上关于hashmap的文章很多,但到底是自己学习的总结,就发出来跟大家一起分享,一起讨论. 1.hashma ...

  8. 10 张图带你深入理解 Docker 容器和镜像

    这篇文章希望能够帮助读者深入理解 Docker 的命令,还有容器(container)和镜像(image)之间的区别,并深入探讨容器和运行中的容器之间的区别. 当我对 Docker 技术还是一知半解的 ...

  9. Linux 下配置 iSCSI 客户端

    安装客户端软件 Redhat/Centos: yum install -y iscsi-initiator-utils Debian/Ubuntu: apt-get install open-iscs ...

  10. 《Linux就该这么学》培训笔记_ch15_使用Postfix与Dovecot部署邮件系统

    <Linux就该这么学>培训笔记_ch15_使用Postfix与Dovecot部署邮件系统 文章最后会post上书本的笔记照片. 文章主要内容: 电子邮件系统 配置Postfix服务程序 ...