1. 程式人生 > >C#生成/呼叫動態連結庫

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。這次呼叫多次,也沒有出現這個錯誤,不知是什麼原因,有時間還得再實驗下。