通过Structuremap加载程序集时的上下文

时间:2010-06-16 16:59:46

标签: c# load assemblies structuremap

我想以与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组件扫描一起工作吗?

1 个答案:

答案 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。