MEF不同的汇编版本加载问题

时间:2013-08-14 19:49:48

标签: c# .net mef

我对MEF有点难题。

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

使用此编写的第一个安装组件使用了SQLServer SMO库的第11版。针对2008R2或2012安装工作正常。 (让我们称这个组件为A)

我有另一个团队将代码迁移到新组件,但该代码使用SQLServer SMO,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”。

1 个答案:

答案 0 :(得分:1)

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

解决此类问题的一种方法是将缺少的程序集添加到GAC。

另一种方法是将包含缺少的程序集的文件夹添加到应用程序的探测路径中。如果您不介意在应用程序基础文件夹(包含可执行文件的文件夹)中部署这些程序集,请执行此操作。否则,您可以将其部署在应用程序基本文件夹的子文件夹中,并将该文件夹添加到 app.config privatePath element

您可以找到有关该文章的更多信息:How the Runtime Locates Assemblies