我想以与shown here类似的方式加载插件,但加载的程序集似乎不共享相同的上下文。
试图解决问题我只是构建了一个包含两个组件的小尖峰。一个控制台应用程序和一个库。控制台应用程序包含IPlugin接口,并且没有对Plugin 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);
}
无效的强制转换异常表示“无法将插件类型转换为IPlugin”。
public class P1 : IPlugin
{
public void Start() { Console.WriteLine("Hello from P1"); }
}
此外,如果我只是构造实例(顺便说一下工作正常)并尝试在插件ObjectFactory中访问ObjectFactory.WhatDoIHave()显示插件实例和主机实例甚至不共享相同的容器实例。
尝试使用MEF,Structuremap并手动加载程序集,而Assembly.Load(“插件”)显示是否使用Assembly.Load加载它可以正常工作。有什么想法我可以解决这个问题与StructureMaps组件扫描一起工作吗?
答案 0 :(得分: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。