C 下反射動態載入dll後如何解除安裝?

2021-10-22 06:23:06 字數 976 閱讀 4281

最近在做專案的時候,遇到乙個需求,需要通過選擇的檔案,先判斷是c#dll還是c++dll,再判斷dll是否是我們需要的特定dll,還是別的隨便乙個dll。

經過研究發現,我們可以通過反射來載入dll,如果用c#的反射機制可以正確載入dll,那麼就可以認為該dll是c#型別的,如果不能正確載入,我們再通過c++的方法來載入進行判斷。

判斷是否特定dll的話,只需在判斷完dll型別後,對dll中的特定類進行判斷即可。

但是這裡,存在乙個問題,通過反射載入完c#dll後,該dll即被占用,無法進行修改(比如,我判斷完該dll後,發現該dll版本選錯了,那麼此時,是沒辦法進行替換的,因為已經被程式載入了),此時,我們即需要對反射載入的該類進行解除安裝。

尷尬的是,c#並沒有對assembly定義釋放方法,這是因為,反射載入完的物件是通過clr進行託管的,只有等到物件無用時,才會通過gc進行**。但這明顯不能滿足我們的需求。

其實,這個問題是可以通過應用程式域來解決的。

要對dll進行判斷時,我們可以建立乙個應用程式域,通過應用程式域的方法來動態載入反射,並且,其提供的unload方法,可以將載入的dll給動態的解除安裝掉。

如,我這裡是這麼處理的。

try}

catch (exception ex)//若異常,則判斷其他型別

注意,這裡會把新建立域中的所有物件都給**。

另外乙個應用場景就是,當我們需要做乙個反編譯工具時,也需要用到這樣的處理,因為不能每次dll更新後都重啟反編譯軟體。

同時,這裡建立域是有一組不同的方法的,並且每個方法都有多個過載,包括

createcominstancefrom

createinstance

createinstanceandunwrap

createinstancefrom

createinstancefromandunwrap

有需要的大家可以自行學習,注意其間的區別。

c 反射 動態載入dll簡單例子

假設已有元件classlibrarytest.dll,放置於程式目錄下。元件中classlibrarytest命名空間下有test類,類中有方法sum。下面示例就是動態載入元件並呼叫sum方法的簡例 1 static void main string args 2 classlibrarytest....

C 動態載入DLL

using system.reflection 利用反射進行動態載入和呼叫.assembly ass assembly.loadfrom dllpath 利用dll的路徑載入 載入dll後,需要使用dll中某類.type type ass.gettype typename 利用型別的命名空間和名稱獲...

C 動態載入DLL

利用反射進行動態載入和呼叫.assembly ass assembly.loadfrom dllpath 利用dll的路徑載入 載入dll後,需要使用dll中某類.type type ass.gettype typename 利用型別的命名空間和名稱獲得型別 需要例項化型別,才可以使用,引數可以人為...