我们有几个常见的库.理想情况下,我们希望他们都使用最新版本的DLL,即使它们是针对较旧的不同版本编译的(假设最新版本是向后兼容的)
例如我们有:
Project dll
Common控件dll
记录dll
数据库访问dll
项目和公共控件引用数据库dll的v2.然而,记录引用v1.
如果在不同的组件中引用了不同的版本,VS如何选择使用哪一个?
我们是否必须重新编译v1 dll以使用最新的数据库(v2),或者我们可以自动获取它吗?
是否可以强制使用特定版本?
谢谢,
亚历克斯
默认情况下,对于版本化的DLL,我相信VS会强制完全匹配.但是,如果查看引用的属性,则会找到名为"特定版本"的属性.将其设置为"false",它将与更高版本匹配.
不幸的是,我没有完整版本的VS和我一起找到合适的MSDN链接.
此外,您可以在app.config中使用assemblyBinding元素.
这里实际上有两种情况 - 使用强名称/ 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完全不同,其中所有应用程序都获取了当前注册的DLL副本(假设V1和V2是二进制兼容的).
我遇到了这个网站,其中有几条建议: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/