【问题标题】:Context while loading Assemblies via Structuremap通过 Structuremap 加载程序集时的上下文
【发布时间】:2010-06-16 16:59:46
【问题描述】:

我想以与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);
}

这会抛出一个无效的转换异常,说“无法将插件类型转换为 IPlugin”。

public class P1 : IPlugin
{
    public void Start() { Console.WriteLine("Hello from P1"); }
}

此外,如果我只是构造实例(顺便说一句,它工作得很好)并尝试访问插件 ObjectFactory.WhatDoIHave() 中的 ObjectFactory,则表明插件实例和主机实例甚至不共享同一个容器实例。

使用 MEF、Structuremap 进行实验并手动加载程序集,Assembly.Load("Plugin") 显示是否使用 Assembly.Load 加载它工作正常。有什么想法可以解决这个问题以使用 StructureMaps 程序集扫描吗?

【问题讨论】:

    标签: c# load assemblies structuremap


    【解决方案1】:

    我找到了解决办法。

    采用这种结构:

    \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。

    【讨论】:

      猜你喜欢
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2019-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多