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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

C# 动态加载 动态卸载

發(fā)布時(shí)間:2023/12/10 C# 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# 动态加载 动态卸载 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
代碼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實(shí)現(xiàn)動(dòng)態(tài)加載DLL,但是當(dāng)你試圖卸載時(shí),你會(huì)很驚訝的發(fā)現(xiàn)Assembly沒(méi)有提供任何卸載的 方法。這是由于托管代碼的自動(dòng)垃圾回收機(jī)制會(huì)做這件事情,所以C#不提供釋放資源的函數(shù),一切由垃圾回收來(lái)做。



這引 發(fā)了一個(gè)問(wèn)題,用Assembly加載的DLL可能只在程序結(jié)束的時(shí)候才會(huì)被釋放,這也意味著在程序運(yùn)行期間無(wú)法更新被加載的DLL。而這個(gè)功能在某些程 序設(shè)計(jì)時(shí)是非常必要的,考慮你正在用反射機(jī)制寫(xiě)一個(gè)查看DLL中所有函數(shù)詳細(xì)信息的程序,程序提供一個(gè)菜單讓用戶可以選擇DLL文件,這時(shí)就需要讓程序能 夠卸載DLL,否則一旦用戶重新得到新版本DLL時(shí),必須要重新啟動(dòng)程序,重新選擇加載DLL文件,這樣的設(shè)計(jì)是用戶無(wú)法忍受的。

C# 也提供了實(shí)現(xiàn)動(dòng)態(tài)卸載DLL的方法,通過(guò)AppDomain來(lái)實(shí)現(xiàn)。AppDomain是一個(gè)獨(dú)立執(zhí)行應(yīng)用程序的環(huán)境,當(dāng)AppDomain被卸載的時(shí) 候,在該環(huán)境中的所有資源也將被回收。關(guān)于AppDomain的詳細(xì)資料參考MSDN。下面是使用AppDomain實(shí)現(xiàn)動(dòng)態(tài)卸載DLL的代碼

?

注意:

1. 要想讓一個(gè)對(duì)象能夠穿過(guò)AppDomain邊界,必須要繼承MarshalByRefObject類,否則無(wú)法被其他AppDomain使用。

2. 每個(gè)線程都有一個(gè)默認(rèn)的AppDomain,可以通過(guò)Thread.GetDomain()來(lái)得到 ?

轉(zhuǎn)載于:https://www.cnblogs.com/xnli1983/archive/2009/12/17/1626227.html

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。