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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM