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. ...
随机推荐
- Linux shell if条件判断2
前面介绍linux shell的if判断的语法,现在再补充一点. Linux shell if条件判断1 分支判断结构 if , case 下面两个结构语法,已经在前面有过示例. 结构1: ...
- 【Servlet】The servlets named [ByteServlet] and [content.ByteServlet] are both mapped to the url-pattern [ByteServlet] which is not permitted
创建时间:6.30 The servlets named [ByteServlet] and [content.ByteServlet] are both mapped to the url-patt ...
- 201871010110-李华《面向对象程序设计(java)》第6-7周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...
- 201871010135 张玉晶 《面向对象程序设计(java)》第二周学习总结
201871010135 张玉晶 <面向对象程序设计(java)>第二周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
- 字符串format()方法的基本使用
<模板字符串>.format(<逗号分隔的参数>) 其中,模板字符串是一个由字符串和槽组成的字符串,用来控制字符串和变量的显示效果.槽用大括号({})表示,对应format() ...
- Jmeter做webservices接口测试
在Soap/XML-RPC Data中输入: <?xml version="1.0" encoding="utf-8"?> <soap12:E ...
- 如何用<dl>标签做表格而不用table标签
我们都知道很多的内容编辑器(TinyMCE编辑器.fck)都有插入表格功能,快速方便,但是这些表格用到的<table>标签,可以查看html源代码就能发现,table标签对搜索引擎不是很友 ...
- IComparable<T>.CompareTo(T) 方法
IComparable<T>.CompareTo(T) 方法 定义 命名空间: System 程序集: System.Runtime.dll, mscorlib.dll, netstand ...
- Ajax 与 Django
目录 Django与AJAX orm优化查询: MTV 与 MVC模型 choices 参数 update 与 save的区别 AJAX导入: Jquery 实现AJAX ajax基本语法结构 原生J ...
- Flask 中的模板语言 Jinja2 及 render_template 的深度用法
是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...