14

我们有几个常见的库。理想情况下,我们希望它们都使用最新版本的 dll,即使它们是针对旧的不同版本编译的(假设最新版本向后兼容)

例如,我们有:

项目 dll
常用控件 dll
日志记录 dll
数据库访问 dll

项目和常用控件参考数据库 dll 的 v2。然而,日志记录参考 v1。

如果在不同的组件中引用了不同的版本,VS 如何选择使用哪一个?
我们是否必须重新编译 v1 dll 才能使用最新的数据库 (v2) 或者我们可以让它自动获取?
是否可以强制使用特定版本?

谢谢,

亚历克斯

4

4 回答 4

11

默认情况下,对于版本化的 DLL,我相信 VS 会强制进行完全匹配。但是,如果您查看参考的属性,您会发现一个名为“特定版本”的属性。将其设置为“false”,它将匹配更高版本。

不幸的是,我没有完整版的 VS 来找到合适的 MSDN 链接。

此外,您可以使用 app.config 中的assemblyBinding元素。

于 2008-10-09T10:35:36.280 回答
8

这里实际上有两种情况——使用强名称/GAC,或者不使用强名称。

如果您使用强名称并将组件安装到 GAC 中,那么 .Net 将希望使用客户端在编译时引用的组件版本。因此,在您的示例中,Project 很可能引用数据库 V2,而 Logging 引用数据库 V1,因为 DLL 可以并行存储在 GAC 中。因此,如果您确实希望 Logging 使用 V2 而不是 V1,则需要修改配置文件以说明“对 V1 的引用应该指向 V2”。有不同的地方可以做到这一点 - 应用程序文件,机器文件等。

如果您不使用强名称,那么 .Net 将默认使用与客户端位于同一文件夹中的 DLL 版本。因此,假设您将 Project、CommonControls 和 Logging 部署在与数据库 V2 相同的文件夹中。然后,即使 Logging 是针对数据库 V1 构建的,它也会尝试使用同一文件夹中的组件,即数据库 V2。只要 V2 可以提供 Logging 想要使用的相同公共类和方法,它就可以正常工作。

在我的环境中——我们所有的应用程序都是内部的——我们不使用 GAC。我们只是将应用程序需要的所有文件部署到一个文件夹中。当你有很多通用组件时,保持配置文件同步简直就是一场噩梦。

这与 COM 完全不同,COM 中所有应用程序都获取当前注册的 DLL 副本(假设 V1 和 V2 是二进制兼容的)。

于 2008-10-09T12:50:20.843 回答
5

我遇到了这个有几个建议的网站:http: //blog.fredrikhaglund.se/blog/2008/02/23/get-control-over-your-assembly-dependencies/

要获得特定版本显然您必须编辑 web.config 或 app.config?

“最后,使用记事本查看您的 csproj 文件(或在 Visual Studio 中卸载项目以便能够将其作为文本打开)。当您使用 Visual Studio 添加引用时,您将获得包含版本号和公钥的程序集引用当您将供应商组件升级到较新版本时,这会给您带来一些麻烦。”
http://blog.fredrikhaglund.se/blog/2008/02/23/get-control-over-your-assembly-dependencies/

于 2008-10-09T11:26:37.347 回答
1

如果您有源代码,则可以使用项目引用而不是 dll 引用。这样你总是能得到最新的。

于 2008-10-09T11:19:25.443 回答