標籤:
這篇文章介紹了c#動態載入卸載DLL的方法,有需要的朋友可以參考一下
c#中通過反射可以方便的動態載入dll程式集,但是如果你需要對dll進行更新,卻發現.net類庫沒有提供卸載dll程式集的方法。在.net 中,加入了應用程式定義域的概念,應用程式定義域是可以卸載的。也就是說,如果需要對動態載入的dll程式集進行更新,可以通過以下方法解決:
建立一個應用程式定義域,在該應用程式定義域中動態載入DLL,然後可以卸載掉該應用程式定義域。該應用程式定義域被卸載的時候,相關資源也會被回收。
要想這樣實現,就要讓你程式的currentDomain和建立的newDomain之間進行通訊,穿過應用程式定義域的邊界。從網上找到了某大牛的解決方案,抄下來留給自己看吧:
using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.Reflection; namespace UnloadDll { class Program { static void Main(string[] args) { string callingDomainName = AppDomain.CurrentDomain.FriendlyName;//Thread.GetDomain().FriendlyName; Console.WriteLine(callingDomainName); AppDomain ad = AppDomain.CreateDomain("DLL Unload test"); ProxyObject obj = (ProxyObject)ad.CreateInstanceFromAndUnwrap(@"UnloadDll.exe", "UnloadDll.ProxyObject"); obj.LoadAssembly(); obj.Invoke("TestDll.Class1", "Test", "It‘s a test"); AppDomain.Unload(ad); obj = null; Console.ReadLine(); } } class ProxyObject : MarshalByRefObject { Assembly assembly = null; public void LoadAssembly() { assembly = Assembly.LoadFile(@"TestDLL.dll"); } public bool Invoke(string fullClassName, string methodName, params Object[] args) { if(assembly == null) return false; Type tp = assembly.GetType(fullClassName); if (tp == null) return false; MethodInfo method = tp.GetMethod(methodName); if (method == null) return false; Object obj = Activator.CreateInstance(tp); method.Invoke(obj, args); return true; } } }
注意:
1. 要想讓一個對象能夠穿過AppDomain邊界,必須要繼承MarshalByRefObject類,否則無法被其他AppDomain使用。
2. 每個線程都有一個預設的AppDomain,可以通過Thread.GetDomain()來得到
您可能感興趣的文章:
- C#調用Matlab產生的dll方法的詳細說明
- C# 調用Delphi dll 執行個體代碼
- C#調用動態unlha32.dll解壓Lha尾碼的打包檔案分享
- C# 調用C++寫的dll的實現方法
- C#將dll打包到程式中的具體實現
- C++調用C#的DLL實現方法
- C++與C#互調dll的實現步驟
- 從C#程式中調用非受管DLLs的方法
- C#實現動態載入dll的方法
- C#動態載入dll擴充系統功能的方法
- C#產生DLL檔案的方法
- C#產生DLL檔案的方法小結
引文連結:
c#動態載入卸載DLL的方法
C# 實現動態載入DLL外掛程式 及HRESULT:0x80131047處理
c#實現動態載入Dll
黃天不負有心人,終於全身而退,哈哈
動態載入dll,擴充系統功能
c#動態載入dll並調用dll中類的方法
c#動態載入卸載DLL的方法