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

歡迎訪問 生活随笔!

生活随笔

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

C#

C# 动态加载 动态卸载

發布時間:2023/12/10 C# 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# 动态加载 动态卸载 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
代碼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;
????????}
????}
}

在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的代碼

?

注意:

1. 要想讓一個對象能夠穿過AppDomain邊界,必須要繼承MarshalByRefObject類,否則無法被其他AppDomain使用。

2. 每個線程都有一個默認的AppDomain,可以通過Thread.GetDomain()來得到 ?

轉載于:https://www.cnblogs.com/xnli1983/archive/2009/12/17/1626227.html

總結

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

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