gpt4 book ai didi

exception - MEF: "Unable to load one or more of the requested types. Retrieve the LoaderExceptions for more information"

转载 作者:行者123 更新时间:2023-12-02 17:34:31 24 4
gpt4 key购买 nike

场景:我正在使用托管扩展性框架根据单独的 dll 中定义的接口(interface)协定在运行时加载插件(导出)。在我的 Visual Studio 解决方案中,我有 3 个不同的项目:主机应用程序、一个类库(定义接口(interface) - “IPlugin”)和另一个实现该接口(interface)的类库(导出 - “MyPlugin.dll”)。

主机在自己的根目录中查找导出,因此在测试期间,我构建了整个解决方案,并将 Plugin.dll 从 Plugin 类库 bin/release 文件夹复制到主机的 debug 目录,以便主机的 DirectoryCatalog 能够找到它并能够将其添加到 CompositionContainer 中。每次重建后,Plugin.dll 不会自动复制,因此每次对契约(Contract)/实现进行更改时,我都会手动执行此操作。

但是,有几次我在没有先复制(更新的)Plugin.dll 的情况下运行主机应用程序,并且它在组合过程中引发了异常:

Unable to load one or more of the requested types. Retrieve the LoaderExceptions for more information

这当然是因为它尝试导入的 Plugin.dll 实现了不同版本的 IPlugin,其中属性/方法签名不匹配。尽管在受控和监控的环境中很容易避免这种情况,只需在插件文件夹中避免(废话)过时的 IPlugin 实现,但我不能在生产环境中依赖这样的假设,因为在生产环境中可能会遇到遗留插件。

问题在于,此异常实际上破坏了整个 Compose 操作,并且没有导出被导入。我更希望简单地忽略不匹配的 IPlugin 实现,以便仍然导入目录中实现正确版本的 IPlugin 的其他导出。

有办法实现这一点吗?我正在考虑以下几种可能的选择:

  • 在调用 Compose 之前或调用 Compose 时,需要在 CompositionContainer 上设置一个标志(“忽略失败的导入”)
  • 有一个类似的标志可以在 <ImportMany()> 上指定属性
  • 有一种方法可以“ Hook ”Compose() 底层的迭代过程,并能够单独处理每个(失败的)导入
  • 使用强名称签名以某种方式仅查找实现 IPlugin 当前版本的导入

想法?

最佳答案

我也遇到过a similar problem .

如果您确定要忽略此类“坏”程序集,那么解决方案是调用 AssemblyCatalog.Parts.ToArray()创建每个装配目录后。这将触发您提到的 ReflectionTypeLoadException 。然后您就有机会捕获异常并忽略错误的程序集。

为所有“好”程序集创建 AssemblyCatalog 对象后,您可以将它们聚合在 AggregateCatalog 中,并将其传递给 CompositionContainer > 构造函数。

关于exception - MEF: "Unable to load one or more of the requested types. Retrieve the LoaderExceptions for more information",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4020532/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com