參考地址: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。這次調用多次,也沒有出現這個錯誤,不知是什么原因,有時間還得再實驗下。