今天,我仔细研究了VisualStudio2010中程序集引用的"特定版本"属性.经过几次意想不到的实验后,我开始尽可能多地了解这个属性是如何工作的.即便如此,在我看来,并不是所有的答案,所以我试图self 回答这个问题:
exactly程序集引用的"特定版本"属性在Visual Studio中是如何工作的?
今天,我仔细研究了VisualStudio2010中程序集引用的"特定版本"属性.经过几次意想不到的实验后,我开始尽可能多地了解这个属性是如何工作的.即便如此,在我看来,并不是所有的答案,所以我试图self 回答这个问题:
exactly程序集引用的"特定版本"属性在Visual Studio中是如何工作的?
需要知道的最重要的事情之一是,"特定版本"是一个在运行时compile-time和not生效的属性.
生成项目时,需要解析项目的程序集引用,以便找到生成系统应该使用的物理程序集.如果执行了"特定版本"判断(请参阅"何时判断特定版本?"),它影响大会决议过程的结果:
部件解析过程查找潜在部件的顺序如下:
<HintPath>
元素引用的程序集请注意,如果GAC中存在多个版本的程序集,则解析过程首先try 解析为具有最高版本的程序集.只有在未进行"特定版本"判断时,这一点才很重要.
VisualStudio根据在中找到的两条信息决定是否执行"特定版本"判断.csproj文件:
<SpecificVersion>
元素的存在或不存在及其值(如果存在)带有版本信息的典型程序集引用如下所示:
<Reference Include="Foo, Version=1.2.3.4, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>True</SpecificVersion>
<HintPath>..\..\Bar\Foo.dll</HintPath>
</Reference>
以下是程序集引用的without个版本信息:
<Reference Include="Foo">
[...]
下表显示了何时执行"特定版本"判断,何时不执行.
| Version information
| Present Not present
-------------------+------------------------------
<SpecificVersion> |
- Present(=True) | 1.Yes 2.Yes (check always fails)
- Present(=False) | 3.No 4.No
- Not present | 5.Yes 6.No
这里令人惊讶的是,如果<SpecificVersion>
和版本信息都不存在,则不会执行任何判断( case 6).我预计判断将被执行并且总是失败(与 case 2相同),因为在我的理解中,缺少<SpecificVersion>
意味着缺省值"True".这可能是Visual Studio2010的一个怪癖,我在那里进行了测试.
在Visual Studio UI中判断程序集引用的属性时( Select 引用并点击F4),您看到的"特定版本"属性的值会告诉您Visual Studio是否要执行"特定版本"判断.在 case 6中,用户界面将显示"True",尽管<SpecificVersion>
元素不在列表中.csproj文件.
如果"Copy Local"属性设置为"True",但程序集解析过程由于"Specific Version"判断而失败,则不复制任何程序集.