最近在做專案的時候,遇到乙個需求,需要通過選擇的檔案,先判斷是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 利用型別的命名空間和名稱獲得型別 需要例項化型別,才可以使用,引數可以人為...