2010-06-16 69 views
0

我想以與shown here類似的方式加載插件,但加載的程序集似乎不共享相同的上下文。通過結構映射加載程序集時的上下文

試圖解決問題,我只是建立一個包含兩個組件的小尖峯。一個控制檯應用程序和一個庫。控制檯應用程序包含IPlugin接口並且沒有對插件dll的引用。

我掃描使用自定義登記公約的插件目錄:

ObjectFactory.Initialize(x => x.Scan(s => 
    { 
     s.AssembliesFromPath(@"..\Plugin"); 
     s.With(new PluginScanner()); 
    })); 

public void Process(Type type, Registry registry) 
{ 
    if (!type.Name.StartsWith("P")) return; 

    var instance = ObjectFactory.GetInstance(type); 
    registry.For<IPlugin>().Add((IPlugin)instance); 
} 

其中thows無效轉換異常說「插件類型不能轉換成IPlugin」。

而且,如果我只是構造實例(其中的方式正常工作),並嘗試訪問的ObjectFactory在插件ObjectFactory.WhatDoIHave()顯示插件實例和主機實例甚至不共享相同的容器實例。

用MEF,Structuremap實驗並手動加載程序集,Assembly.Load(「Plugin」)顯示如果用Assembly.Load加載它工作正常。任何想法我可以如何解決這個與StructureMaps程序集掃描工作?

回答

0

我找到了解決方案。

採取這種結構:

\Plugins 
     \Plugin.dll 
     \core.dll 
\app.exe 
\core.dll 

所以IPlugin在core.dll定義。我的插件與核心以及我的應用程序有依賴關係。 我的應用程序加載core.dll並加載plugin.dll,它將在其插件文件夾中搜索其依賴項。再次加載core.dll。

如果我從Plugin.dll中獲得一個類型,並嘗試將其轉換爲核心中的IPlugin,則應用程序會嘗試將{PluginDir} Core.IPlugin的子類轉換爲{AppDir} Core.IPlugin。這會因爲接口不同而失敗。

\Plugin.dll 
\app.exe 
\core.dll  

這種情況下可以正常工作,因爲app.exe和plugin.dll都會使用相同的core.dll。