我们有几个常见的库。理想情况下,我们希望他们都使用最新版本的DLL,即使它们是针对较旧的不同版本编译的(假设最新版本是向后兼容的)
例如我们有:
项目dll
共同控制dll
记录dll
数据库访问dll
项目和公共控件引用数据库dll的v2。然而,记录引用v1。
如果在不同的组件中引用了不同的版本,VS如何选择使用哪一个?
我们是否必须重新编译v1 dll才能使用最新的数据库(v2),或者我们可以自动获取它吗?
是否可以强制使用特定版本?
谢谢,
亚历
答案 0 :(得分:11)
默认情况下,对于版本化的DLL,我相信VS会强制完全匹配。但是,如果查看引用的属性,则会找到名为“特定版本”的属性。将其设置为“false”,它将与更高版本匹配。
遗憾的是,我没有完整版本的VS与我一起找到合适的MSDN链接。
此外,您可以使用app.config中的assemblyBinding元素。
答案 1 :(得分:8)
这里实际上有两种情况 - 使用强名称/ GAC,或者不使用强名称。
如果您使用强名称并将组件安装到GAC中,则.Net将希望使用客户端在编译时引用的组件版本。因此,在您的示例中,Project很可能引用数据库V2,而Logging引用数据库V1,因为DLL可以并行存储在GAC中。因此,如果您确实希望Logging使用V2而不是V1,则需要修改配置文件以表示“应将V1的引用指向V2”。这有不同的地方 - app文件,机器文件等。
如果您没有使用强名称,那么.Net将默认使用与客户端位于同一文件夹中的DLL版本。因此,假设您将Project,CommonControls和Logging部署在与数据库V2相同的文件夹中。然后,即使Logging是针对数据库V1构建的,它也会尝试使用同一文件夹中的组件,即数据库V2。只要V2可以提供Logging想要使用的相同公共类和方法,它就可以正常工作。
在我的环境中 - 我们的所有应用程序都是内部的 - 我们不使用GAC。我们只需将应用程序所需的所有文件部署到一个文件夹中。当你有很多常见组件时,保持配置文件同步只是一场噩梦。
这与COM完全不同,其中所有应用程序都选择了当前注册的DLL副本(假设V1和V2是二进制兼容的)。
答案 2 :(得分:5)
我遇到过这个网站,其中有几条建议: http://blog.fredrikhaglund.se/blog/2008/02/23/get-control-over-your-assembly-dependencies/
要获得特定版本,显然您必须编辑web.config或app.config?
“最后,使用notepad查看你的csproj文件(或者在Visual Studio中卸载项目以便能够以文本形式打开它。)当你使用Visual Studio添加引用时,你将得到一个带有两个版本号的程序集引用和公钥,当您将供应商组件升级到更新版本时,这会给您带来一些麻烦。“ http://blog.fredrikhaglund.se/blog/2008/02/23/get-control-over-your-assembly-dependencies/
答案 3 :(得分:1)
如果您有源代码,则可以使用项目引用而不是dll引用。这样你就会得到最新的。