c#動(dòng)態(tài)加載卸載DLL的方法
c#中通過(guò)反射可以方便的動(dòng)態(tài)加載dll程序集,但是如果你需要對(duì)dll進(jìn)行更新,卻發(fā)現(xiàn).net類庫(kù)沒(méi)有提供卸載dll程序集的方法。在.net 中,加入了應(yīng)用程序域的概念,應(yīng)用程序域是可以卸載的。也就是說(shuō),如果需要對(duì)動(dòng)態(tài)加載的dll程序集進(jìn)行更新,可以通過(guò)以下方法解決:
新建一個(gè)應(yīng)用程序域,在該應(yīng)用程序域中動(dòng)態(tài)加載DLL,然后可以卸載掉該應(yīng)用程序域。該應(yīng)用程序域被卸載的時(shí)候,相關(guān)資源也會(huì)被回收。
要想這樣實(shí)現(xiàn),就要讓你程序的currentDomain和新建的newDomain之間進(jìn)行通信,穿過(guò)應(yīng)用程序域的邊界。從網(wǎng)上找到了某大牛的解決方法,抄下來(lái)留給自己看吧:
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. 要想讓一個(gè)對(duì)象能夠穿過(guò)AppDomain邊界,必須要繼承MarshalByRefObject類,否則無(wú)法被其他AppDomain使用。
2. 每個(gè)線程都有一個(gè)默認(rèn)的AppDomain,可以通過(guò)Thread.GetDomain()來(lái)得到
- C# WPF如何反射加載Geometry幾何圖形數(shù)據(jù)圖標(biāo)
- c# WPF中自定義加載時(shí)實(shí)現(xiàn)帶動(dòng)畫(huà)效果的Form和FormItem
- c# 實(shí)現(xiàn)網(wǎng)頁(yè)加載后將頁(yè)面截取為長(zhǎng)圖片
- C# 根據(jù)表格偶數(shù)、奇數(shù)加載不同顏色
- C# 動(dòng)態(tài)加載程序集信息
- C#中調(diào)用DLL時(shí)未能加載文件或程序集錯(cuò)誤的處理方法(詳解)
- C#中加載dll并調(diào)用其函數(shù)的實(shí)現(xiàn)方法
- c# 動(dòng)態(tài)加載dll文件,并實(shí)現(xiàn)調(diào)用其中的簡(jiǎn)單方法
- C#使用Jquery zTree實(shí)現(xiàn)樹(shù)狀結(jié)構(gòu)顯示 異步數(shù)據(jù)加載
- C#使用反射加載多個(gè)程序集的實(shí)現(xiàn)方法
- C#實(shí)現(xiàn)動(dòng)態(tài)加載dll的方法
- 3種C# 加載Word的方法
相關(guān)文章
C# websocket及時(shí)通信協(xié)議的實(shí)現(xiàn)方法示例
說(shuō)到websocket大家一定不會(huì)陌生,WebSocket是HTML5一種新的協(xié)議。下面這篇文章主要給大家介紹了關(guān)于C# websocket及時(shí)通信協(xié)議的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-11-11C# 字符串與unicode互相轉(zhuǎn)換實(shí)戰(zhàn)案例
這篇文章主要介紹了C# 字符串與unicode互相轉(zhuǎn)換實(shí)戰(zhàn)案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01C#使用Objects?Comparer進(jìn)行對(duì)象比較
本文主要介紹了C#使用Objects?Comparer進(jìn)行對(duì)象比較,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07C# 正則表達(dá)式常用的符號(hào)和模式解析(最新推薦)
這篇文章主要介紹了C# 正則表達(dá)式常用的符號(hào)和模式解析,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12C# 實(shí)現(xiàn)截圖軟件功能實(shí)例代碼
這篇文章主要介紹了C# 實(shí)現(xiàn)截圖軟件功能實(shí)例代碼,需要的朋友可以參考下2017-06-06C#反射在實(shí)際應(yīng)用中的實(shí)例代碼
C#反射在實(shí)際應(yīng)用中的實(shí)例代碼,需要的朋友可以參考一下2013-03-03