0

我对 MEF 有点困惑。

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

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

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

当 MEF 去加载组件 BI 时,获取 SQLServer DLL (Microsoft.SqlServer.Replication) 之一的 LoaderExceptionFailure。它实际上给出了 FileNotFoundException(列出 DLL)。DLL 存在于组件的目录中。这是正确的版本 10。

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

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

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

4

1 回答 1

1

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

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

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

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

于 2013-08-18T13:02:26.497 回答