C#生成/调用动态链接库

时间:2021-08-04 15:50:16

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

 

一、需求描述

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

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

二、生成动态链接库

  (1)新建类库

C#生成/调用动态链接库

(2)添加WelcomeInfo类

C#生成/调用动态链接库

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

 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动态链接库

C#生成/调用动态链接库

  生成的dll在这里啦

C#生成/调用动态链接库

 

二、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)效果

C#生成/调用动态链接库

三、调用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。这次调用多次,也没有出现这个错误,不知是什么原因,有时间还得再实验下。