C#生成/调用动态链接库
参考地址: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#生成/调用动态链接库的更多相关文章
- Qt调用VC++生成的动态链接库
Qt如何调用VC++生成的动态链接库?假设当前有VC++编译器生成的动态库文件testdll.h,testdll.lib和testdll.dll. testdll.h文件源码如下: #ifdef TE ...
- Qt不同版本编译器,调用VC++生成的动态链接库
今天用QT编译生成的共享库自己却怎么都不能调用,查了N久后找到这个帖子,发现搞定了,记录一下 http://qiusuoge.com/12720.html Qt如何调用VC++生成的动态链接库?假设当 ...
- VS2010创建和调用动态链接库
当我们开发一个产品的时候,我们并不想把源码公布给对方,除了给对方提供exe可执行文件外,我们还可以生成动态链接库,供程序调用,方便二次开发. 下面我将简单梳理一下如何创建和调用动态链接库,方便大家程序 ...
- VC++ 6.0如何创建与调用动态链接库
原文:http://blog.csdn.net/wanghaihao_1/article/details/51098451 1.静态链接库与动态链接库区别: 静态链接库:lib中的指令被直接包含在最终 ...
- Java调用动态链接库so文件(传参以及处理返回值问题)
刚来到公司,屁股还没坐稳,老板把我叫到办公室,就让我做一个小程序.我瞬间懵逼了.对小程序一窍不通,还好通过学习小程序视频,两天的时间就做了一个云开发的小程序,但是领导不想核心的代码被别人看到,给了我一 ...
- BCB如何编写,调用动态链接库DLL
一 编写动态链接库DLL DLL简称动态链接库,是Windows中程序的重要组成部分.想象一下,一个程序需要多人共同完成开发,怎么个共同法?这时我们就要考虑把程序分为好几个模块,团队每一个成员开发一个 ...
- 跨平台开发 -- C# 使用 C/C++ 生成的动态链接库
操作环境:Visual Studio 2017 如何实现 使用 C# 进行嵌入式开发? .NET Core 虽然实现了跨平台,但是不可能处处使用 C# 开发,就好像没人使用SQL开发安卓APP,每种语 ...
- python中使用ctypes调用MinGW生成的动态链接库(dll)
关于gcc编译dll的我就不说了,网上举例一大堆,下面以g++为例. 假设有一个test.cpp文件如下: extern "C" { __declspec(dllexport) d ...
- C#调用C++生成的动态链接库DLL
一.背景 由于要使用C#写app,所以要把C++生成的DLL在C#中调用,所以就涉及怎样去调用外部的dll问题. 二.C#调用外部DLL 首先先看下C#调用外部DLL的代码 using System. ...
随机推荐
- <人人都懂设计模式>-状态模式
同样是水,固态,气态,液态的变化,是由温度引起. 引此为思考状态模式. from abc import ABCMeta, abstractmethod # 引入ABCMeta和abstractmeth ...
- ajax 简单例子
Html 代码: <html> <body> <div id="myDiv"><h3>Let AJAX change this te ...
- GitHub 下载代码命令并且导入到IDEA环境
git clone项目到本地(项目有master和其他分支) 1.首先新建一个空文件夹,在文件夹里面git初始化操作,在文件夹的根目录下,右键选择git bash here,在弹出窗体中: ...
- python nose 自写插件打乱class类中用例执行顺序,但将test_a和test_z排除
在使用nose时,有这样一个需求,用例执行打乱,但部分用例因场景原因必须先执行,这类用例在写用例时人为的加上了test_a或test_z字样 网上找了一圈,都没找到合适的方法,只有自己写插件了 已写完 ...
- 第二阶段团队冲刺(个人)——One
今天的任务:修改登录界面.将原有的登录界面全部改掉,仿照千图网,做界面.
- emacs第一天
emacsbinw64.sourceforge.net windows的emacs下载地方(绿色软件) 学习快速入门 C-h t 快速入门的帮助文档 C-h 是prefix key 光标移动快捷键 ...
- OpenCV 学习笔记(15)openc解帧视频
1 修改读取视频的地址 2 修改保存图片序列的路径 String videopath = "F:/dongdong/0tool/3D/2模型/相机阵列/1_12cam亿级相机/数据/giga ...
- VMware Workstation创建Windows2012server虚拟机
镜像文件需要下载到物理机 3.需要输入iso文件 对应的密钥 定义普通的用户名与密码 4.指定按照路径 5. 大概都是下一步 根据提示需要重启 选择带GUI的服务器进行安装,因为windows命令行模 ...
- innerHTML, innerText, outerHTML, outerText的区别
innerHTML:返回标签内部嵌套的子元素的所有html标签+文本内容content. innerText:返回标签内部嵌套的子元素的文本内容content. outerHTML:返回标签本身+嵌套 ...
- 【医学】三分钟看懂乳腺BI-RADS分级
“BI-RADS”是指美国放射学会的乳腺影像报告和数据系统(Breast Imaging Reporting and Data System)的缩写.BI-RADS分级法将乳腺病变分为0-6级,用来评 ...