2011-02-25 108 views
8

我有一個程序需要使用大量的插件。動態加載DLL

每個插件必須支持一個非常基本的接口,這個接口在一個DLL中定義(IBaseComponent爲了簡單起見)。

每個插件都將位於特定目錄(AppDirectory \ plugin \ plugin-type)中。 每個插件都可以具有該插件的dll(AppDirectory \ plugin \ plugin-type \ plugin-name.dll)的任何名稱。

所以我需要通過每個插件子目錄進行檢查,發現有支撐IBaseComponent接口的類的每個插件,實例化類,並調用該插件的一些功能分析。

確定,所有罰款和花花公子,這些都不是特別困難。但問題是我似乎遇到了一些奇怪的問題。

每個插件都需要在單獨的插件文件夾中有Base.dll文件(而不是僅僅在將要加載插件的程序中),並且似乎我在動態加載dll時遇到了很多錯誤和警告有DLL的,也需要加載。

我使用:

pluginModule = System.Reflection.Assembly.ReflectionOnlyLoadFrom(PathToAssembly); 

爲了搶插件DLL和使用:

types = moduleAssembly.GetTypes(); 

爲了搶包含在DLL中的類型。 我遍歷類型和檢查,如果個別類型是IBaseComponent接口(表示這是一個有效裝載類)有:

if (type.GetInterface("FrameworkNameSpace.IBaseComponent") != null) 
    //it's of the IBaseComponent interface 

後來,爲了真正從創建類的實例該dll我用:

pluginModule = System.Reflection.Assembly.LoadFrom(PathToAssembly); 

,然後使用:

types = component.GetTypes(); 

爲了得到模塊中的類型,然後選擇並加載類支持與上述相同的界面。

的問題似乎是,當我使用:

types = component.GetTypes(); 

當實際嘗試加載類,而不是簡單地看它。 (因此,我LoadFromReflectionOnlyLoad不同的使用)

我收到關於GetTypes例外致電(!在第二個插頭,但從來沒有在前)是:

{"Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information."} 

隨着LoaderExceptions屬性爲:

{"The specified module could not be found. (Exception from HRESULT: 0x8007007E)":null} 

我不確定爲什麼會出現這種情況。該DLL位於插件文件夾中,並且包含IBaseComponent接口的DLL也位於每個插件目錄中。我是否以這種錯誤的方式去做?

我還需要在每個plugin子目錄以及程序本身使用的DLL中保存一個包含IBaseComponent的DLL的副本,還是我做了一些不正確的事情,以允許我刪除這個需求?

我知道MEF這是我想用但不幸的是,因爲我需要支持這種基於.NET 2.0,我無法使用MEF的。

+1

您可以啓用日誌的融合,看看是否有融合/裝配載荷的問題(fuslogvw.exe)? – rene 2011-02-25 22:05:35

回答

5

這是一個的LoadLibrary()失敗。聽起來你的插件有一些依賴於一些非託管的DLL。是的,Windows將很難找到這些DLL,它沒有理由查看插件目錄。也許這是第一次,因爲你的應用程序的默認目錄恰好設置爲正確的目錄。那麼這也將是解決方法,使用Environment.CurrentDirectory。

找出究竟哪些依賴無法找到是關鍵。非託管的人是不會在fuslogvw.exe展現出來,你可以挖掘出來,從Sysinternals的procmon中實用工具痕跡。

+0

好的。我會搗鼓這些東西,看看我能找到什麼。這是一個很好的研究方向。我會說如果我知道了。感謝您的幫助。 – 2011-03-01 17:11:40

+0

將Environment.CurrentDirectory更改爲當前插件的目錄不能解決問題。我認爲這可能是IBaseComponent DLL嘗試被第二個插件加載的問題。看起來,第一個插件可以正確找到所有內容,並且在第二個插件嘗試加載時死機並且死亡的時候很高興。 DLL的可能存在衝突?不知道那裏發生了什麼。仍在瀏覽ProcMon的內容。當我知道更多時會迴應。再次感謝你。 – 2011-03-01 18:11:32

+0

這似乎可能有一個文件「MSRVC71.dll」的問題,這看起來是一個Microsoft Visual C dll文件?這導致我相信這可能是一個與我的dll的DLL加載(這反過來加載這個DLL,樂嘆)的問題。將更新,因爲我更多地瞭解,我可能在這裏瘋狂追逐。我們將會看到。 – 2011-03-01 18:25:50