我试图在.NET 4中创建一个可扩展的“实用程序”控制台应用程序,我认为使用MEF这样做会给我带来最好的灵活性和可扩展性。
因此,我开始设置MEF 接口:。
public interface IUtility
{
string Title { get; }
string Version { get; }
void Execute(UtilContext context);
}然后,我创建了两个几乎相同的测试插件--看看这些插件是如何工作的:
MEF:
[Export(typeof(IUtility))]
public class Utility1 : IUtility
{
public string Title
{
get { return "Utility 1"; }
}
public string Version
{
get { return "1.0.0.0"; }
}
public void Execute(UtilContext context)
{
}
}充当MEF插件“主机”的控制台应用程序如下所示:
[ImportMany]
public IEnumerable<IUtility> _utilities { get; set; }
public void SetupMEF()
{
string directory = ConfigurationManager.AppSettings["Path"];
AggregateCatalog catalog = new AggregateCatalog();
catalog.Catalogs.Add(new DirectoryCatalog(directory));
CompositionContainer container = new CompositionContainer(catalog);
container.ComposeParts(this);
}我检查了--目录正在从app.config中正确读取,在构建解决方案之后,插件模块(*.dll文件)就在那里出现了。一切似乎都很好.直到我得到这个例外:
System.Reflection.ReflectionTypeLoadException未被处理
Message =无法加载一个或多个请求类型。检索LoaderExceptions属性以获得更多信息。
LoaderException:
在程序集‘get_Version,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null’中键入'Utility.Utility1‘的’Utility.Utility1‘方法没有实现
嗯……MEF到底想告诉我什么?我该怎么解决这个问题?有什么想法,想法,建议吗?
我是否打破了某些约定,拥有一个名为Version的属性?这是MEF预订的东西吗?
发布于 2012-06-03 12:39:55
抱歉,伙计们-我的错。在"plugin“目录中徘徊着一个非常古老的*.dll,它实际上没有任何实现该属性的Get方法。
*.dll解决了我的问题。我现在确实可以加载我的插件了,它们可以没有任何问题地拥有一个名为Version的属性。
https://stackoverflow.com/questions/10870285
复制相似问题