C#生成/调用动态链接库
参考地址:https://www.cnblogs.com/qq4004229/archive/2013/01/30/2882409.html
一、需求描述
(1)用代码生成动态链接库
(2)用C#代码调用动态链接库
二、生成动态链接库
(1)新建类库
(2)添加WelcomeInfo类
代码如下(仅供测试用,例子很简单):
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace GenerateDLL 8 { 9 public class WelcomeInfo 10 { 11 public string ShowMsg(string name) 12 { 13 string str = "welcome " + name; 14 return str; 15 } 16 } 17 }
(3)生成DLL动态链接库
生成的dll在这里啦
二、c#调用dll
(1)新建一个控制台程序
(2)方法一
1 Assembly assembly = Assembly.LoadFile("E:/haoStudy/GenerateDLL/GenerateDLL/bin/Debug/GenerateDLL.dll"); 2 3 //获取类型,参数(命名空间+类) 4 Type type = assembly.GetType("GenerateDLL.WelcomeInfo"); 5 6 //创建该对象的实例,object类型,参数(命名空间+类) 7 object instance = assembly.CreateInstance("GenerateDLL.WelcomeInfo"); 8 9 //设置方法中的参数类型,Type[]类型;如有多个参数可以追加多个 10 Type[] params_type = new Type[1]; 11 params_type[0] = Type.GetType("System.String"); 12 //设置方法中的参数值;如有多个参数可以追加多个 13 Object[] params_obj = new Object[1]; 14 params_obj[0] = "Lucy"; 15 16 //执行ShowMsg方法 17 string str = type.GetMethod("ShowMsg", params_type).Invoke(instance, params_obj).ToString(); 18 Console.WriteLine(str); 19 Console.Read();
(3)方法二
1 Assembly assembly = Assembly.LoadFile("E:/haoStudy/GenerateDLL/GenerateDLL/bin/Debug/GenerateDLL.dll"); 2 //获取类型,参数(命名空间 + 类) 3 Type typeDBHelpher = assembly.GetType("GenerateDLL.WelcomeInfo"); 4 object oDBHelper = Activator.CreateInstance(typeDBHelpher); 5 //需要调用的方法名 6 MethodInfo method = typeDBHelpher.GetMethod("ShowMsg"); 7 //参数集合 8 object v = method.Invoke(oDBHelper, new object[] { "Lucy" }); 9 string str = v.ToString(); 10 Console.WriteLine(str); 11 Console.Read();
说明:两个方法大同小异,只是个别写法不一样,我个人更喜欢用第一种方法,感觉思路更清晰。
(3)效果
三、调用dll一次之后,就不能进行调用了,提示dll被占用的解决方案
1 //Assembly assembly = Assembly.LoadFile("E:/haoStudy/GenerateDLL/GenerateDLL/bin/Debug/GenerateDLL.dll"); 2 //此处改成这种方式即可 3 byte[] byteDLL = System.IO.File.ReadAllBytes("E:/haoStudy/GenerateDLL/GenerateDLL/bin/Debug/GenerateDLL.dll"); 4 Assembly assembly = Assembly.Load(byteDLL); 5 //获取类型,参数(命名空间+类) 6 Type type = assembly.GetType("GenerateDLL.WelcomeInfo"); 7 8 //创建该对象的实例,object类型,参数(命名空间+类) 9 object instance = assembly.CreateInstance("GenerateDLL.WelcomeInfo"); 10 11 //设置方法中的参数类型,Type[]类型;如有多个参数可以追加多个 12 Type[] params_type = new Type[1]; 13 params_type[0] = Type.GetType("System.String"); 14 //设置方法中的参数值;如有多个参数可以追加多个 15 Object[] params_obj = new Object[1]; 16 params_obj[0] = "Lucy"; 17 18 //执行ShowMsg方法 19 string str = type.GetMethod("ShowMsg", params_type).Invoke(instance, params_obj).ToString(); 20 Console.WriteLine(str); 21 Console.Read();
疑问:之前是在同一个页面既生成dll,又调用dll,就会出现“被占用”的错误,而且也无法多次调用同一dll。这次调用多次,也没有出现这个错误,不知是什么原因,有时间还得再实验下。