日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#中动态加载和卸载DLL

發布時間:2025/4/14 C# 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#中动态加载和卸载DLL 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在C++中加載和卸載DLL是一件很容易的事,LoadLibrary和FreeLibrary讓你能夠輕易的在程序中加載DLL,然后在任何地方卸載。在C#中我們也能使Assembly.LoadFile實現動態加載DLL,但是當你試圖卸載時,你會很驚訝的發現Assembly沒有提供任何卸載的方法。這是由于托管代碼的自動垃圾回收機制會做這件事情,所以C#不提供釋放資源的函數,一切由垃圾回收來做。

?

這引發了一個問題,Assembly加載的DLL可能只在程序結束的時候才會被釋放,這也意味著在程序運行期間無法更新被加載的DLL。而這個功能在某些程序設計時是非常必要的,考慮你正在反射機制寫一個查看DLL中所有函數詳細信息的程序,程序提供一個菜單讓戶可以選擇DLL文件,這時就需要讓程序能夠卸載DLL,否則一旦戶重新得到新版本DLL時,必須要重新啟動程序,重新選擇加載DLL文件,這樣的設計是戶無法忍受的。

C#也提供了實現動態卸載DLL的方法,通過AppDomain來實現。AppDomain是一個獨立執行應程序的環境,當AppDomain被卸載的時候,在該環境中的所有資源也將被回收。關于AppDomain的詳細資料參考MSDN。下面是使AppDomain實現動態卸載DLL的代碼,

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()來得到

轉載:地址不詳^_^

轉載于:https://www.cnblogs.com/zzh1236/p/3289043.html

總結

以上是生活随笔為你收集整理的C#中动态加载和卸载DLL的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。