MEF:“无法加载一个或多个请求的类型。检索LoaderExceptions以获取更多信息”
场景:我正在使用Managed Extensibility Framework在运行时根据在单独的dll中定义的接口契约加载插件(导出)。在我的Visual Studio解决方案中,我有3个不同的项目:主机应用程序,类库(定义接口 - “IPlugin”)和另一个实现接口的类库(导出 - “MyPlugin.dll”)。
主机在其自己的根目录中查找导出,因此在测试期间,我构建整个解决方案并将Plugin.dll从Plugin类库bin / release文件夹复制到主机的调试目录,以便主机的DirectoryCatalog可以找到它并且能够将它添加到CompositionContainer。每次重建后都不会自动复制Plugin.dll,所以每次我对合同/实现进行更改时都会手动执行。
但是,有几次我运行主机应用程序而没有先复制(更新的)Plugin.dll,并且它在组合期间抛出异常:
Unable to load one or more of the requested types. Retrieve the LoaderExceptions for more information
这当然是因为它试图导入的Plugin.dll实现了不同版本的IPlugin,其中属性/方法签名不匹配。虽然在受控和受监控的环境中很容易避免这种情况,但通过简单地避免(duh)插件文件夹中过时的IPlugin实现,我不能依赖于可能遇到传统插件的生产环境中的这种假设。
问题是这个异常有效地破坏了整个Compose动作,并且没有导入导出。我宁愿忽略不匹配的IPlugin实现,因此仍会导入实现正确版本的IPlugin的目录中的其他导出。
有没有办法实现这个目标?我在想几种可能的选择:
在调用Compose之前或调用Compose时,要在CompositionContainer上设置一个标志(“忽略失败的导入”)
在<ImportMany()>
属性上有一个类似的标志
有一种方法可以“挂钩”基于Compose()的迭代过程,并且能够单独处理每个(失败的)导入
使用强名称签名以某种方式仅查找实现当前版本的IPlugin的导入
想法?
没有找到相关结果
已邀请:
3 个回复
古擅坛犯
。然后你有机会捕获异常并忽略坏程序集。 为所有“好”程序集创建
对象后,可以将它们聚合在一个
中并将其传递给
构造函数。
递劝臼类洪
坝镰补翔奋