2010-06-16 65 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。