今天,我仔细研究了Visual Studio 2010中程序集引用的“特定版本”属性。在进行了一些意想不到的结果的实验之后,我开始尽可能多地了解该属性的工作方式。在我看来,即使如此,也无法提供所有答案,因此,这是我尝试自我回答的问题:
如何准确地做在Visual Studio程序集引用作品的“特定版本”属性?
其中一个知道的最重要的事情是,“特定版本”是,需要在效果的属性编译时和不运行时。
生成项目时,需要解析该项目的程序集引用,以便找到构建系统应使用的物理程序集。如果执行了“特定版本”检查(请参阅“何时检查“特定版本”?”部分),这会影响程序集解析过程的结果:
程序集解析过程查找潜在程序集的顺序似乎是这样的:
<HintPath>
.csproj文件中的元素引用的程序集请注意,如果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中,尽管<SpecificVersion>
.csproj文件中不存在该元素,但UI将显示“ True” 。
如果将“复制本地”属性设置为“真”,但程序集解析过程由于“特定版本”检查而失败,则不会复制任何程序集。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句