![](/img/trans.png)
[英]solving an assembly conflict issue — Visual Studio project reference + specific version
[英]How exactly does the “Specific Version” property of an assembly reference work in Visual Studio?
今天,我仔细研究了Visual Studio 2010中程序集引用的“特定版本”属性。经过一些意外结果的实验后,我开始尽可能多地了解该属性的工作原理。 即便如此,在我看来,并没有得到所有的答案,所以这是我尝试自我回答这个问题:
究竟怎样在Visual Studio程序集引用作品的“特定版本”属性?
要知道的最重要的事情之一是“特定版本”是一个在编译时而 不是在运行时生效的属性。
构建项目时,需要解析项目的程序集引用,以便查找构建系统应使用的物理程序集。 如果执行“特定版本”检查(请参阅“何时”特定版本“选中?”部分),则会影响装配解决过程的结果:
程序集解析过程查找潜在程序集的顺序如下所示:
<HintPath>
元素引用的程序集 请注意,如果GAC中存在多个版本的程序集,则解析过程首先尝试解析为具有最高版本的程序集。 仅在未进行“特定版本”检查时,这一点很重要。
Visual Studio决定是否对.csproj文件中的两条信息执行“特定版本”检查:
<SpecificVersion>
元素及其值(如果存在) 这是带有版本信息的典型程序集引用的样子:
<Reference Include="Foo, Version=1.2.3.4, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>True</SpecificVersion>
<HintPath>..\..\Bar\Foo.dll</HintPath>
</Reference>
这就是没有版本信息时程序集引用的样子:
<Reference Include="Foo">
[...]
下表显示执行“特定版本”检查的时间,以及何时不执行。
| Version information
| Present Not present
----------------------------+------------------------------
<SpecificVersion> |
- Present, has value True | Yes (1) Yes (check always fails) (2)
- Present, has value False | No (3) No (4)
- Not present | Yes (5) No (6)
令人惊讶的是,如果不存在<SpecificVersion>
和版本信息,则不执行检查(案例6)。 我本来希望执行检查并始终失败(与案例2相同),因为在我的理解中,缺少<SpecificVersion>
意味着默认值“True”。 这可能是Visual Studio 2010的一个怪癖,我在那里进行了测试。
在Visual Studio UI中检查程序集引用的属性(选择引用并按F4)时,您在“特定版本”属性中看到的值会告诉您Visual Studio是否要执行“特定版本”校验。 在案例6中,UI将显示“True”,尽管.csproj文件中不存在<SpecificVersion>
元素。
如果“复制本地”属性设置为“True”但由于“特定版本”检查而导致程序集解析过程失败,则不会复制任何程序集。
添加引用时,Visual Studio会在项目文件中记录程序集的[AssemblyVersion]。 这个很重要。 例如,如果您在一年后创建了一个错误修复程序,那么您需要确保使用完全相同的引用版本重新构建项目,这样才能真正实现这一目标。 如果引用程序集已更改,您将收到错误。
但这并不总是令人满意的。 一些程序员让程序集版本自动递增,每次重建时都会生成一个新版本。 尽管程序集的公共接口从未改变过。 有些人通过使用Nuget获取库来配置他们的项目,并在有新版本可用时让它自动更新库。 他们希望将Specific Version属性设置为False以抑制编译错误。
了解后果非常重要,您需要重新部署整个程序版本以避免事故。 运行时版本不匹配会导致程序崩溃,并且只能通过.config文件中的<bindingRedirect>
来抑制这种风险。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.