MEF不同程序集版本加载问题

本文关键字:加载 问题 版本 程序集 MEF | 更新日期: 2023-09-27 18:27:46

我对MEF有点困惑。

我有一个安装程序和配置应用程序外壳,它使用MEF加载单独的安装程序组件。这使得最终用户能够从已放置到可分发安装中的任何组件中进行选择。

编写的第一个安装组件使用的是SQLServerSMO库的版本11。针对2008R2或2012进行安装效果良好。(让我们把这个组件称为A)

我有另一个团队将代码迁移到一个新组件,但该代码使用SQLServerSMO、RMO和SSIS(DTS)库的版本10。(让我们称之为组件B)

当MEF加载组件B时,我会得到一个SQLServer DLL(Microsoft.SQLServer.Replication)的LoaderExceptionFailure。它实际上会给出一个FileNotFoundException(列出DLL)。DLL存在于组件的目录中。这是正确的版本10。

shell应用程序中已经有版本11的文件。

有没有一种方法可以告诉应用程序上下文该做什么?有没有一种方法可以告诉组件加载它需要的任何特定库?

我想假设每个组件都可以指定"Associated.Library,Version=1.0.0.0,publickey=abcdef123456789,culture=none"。

MEF不同程序集版本加载问题

CLR(而非MEF)找不到程序集的原因是它既不在GAC中,也不在当前AppDomain设置为探测程序集的位置。

处理这类问题的一种方法是将丢失的程序集添加到GAC中。

另一种方法是将包含丢失程序集的文件夹添加到应用程序的探测路径中。如果你不介意在应用程序基本文件夹(包含可执行文件的文件夹)中部署这些程序集,那么就这样做。否则,你可以在应用程序基础文件夹的子文件夹中添加部署程序集,并将该文件夹添加到app.config的privatePath元素中。

您将在文章中找到更多信息:运行时如何定位程序集。