我有一個程序需要使用大量的插件。動態加載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();
當實際嘗試加載類,而不是簡單地看它。 (因此,我LoadFrom和ReflectionOnlyLoad不同的使用)
我收到關於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的。
您可以啓用日誌的融合,看看是否有融合/裝配載荷的問題(fuslogvw.exe)? – rene 2011-02-25 22:05:35