【发布时间】: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