Answers:
其中一个知道的最重要的事情是,“特定版本”是,需要在效果的属性编译时和不运行时。
生成项目时,需要解析项目的程序集引用,以便找到构建系统应使用的物理程序集。如果执行“特定版本”检查(请参阅“何时检查“特定版本”?”部分),这会影响程序集解析过程的结果:
程序集解析过程查找潜在程序集的顺序似乎是这样的:
<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” 。
如果将“复制本地”属性设置为“真”,但是由于“特定版本”检查而导致程序集解析过程失败,则不会复制任何程序集。
PublicKeyToken=
的一部分)。另外,如果您在我的帖子末尾检查表格,您会发现即使Version=
.csproj中的程序集名称中缺少零件,也可以进行版本检查。问题2:我假设程序集名称用于比较,是的。我不知道其他信息来源。
<SpecificVersion>
标记将被完全省略,该标记以前的值为False。
添加引用后,Visual Studio会将程序集的[AssemblyVersion]记录在项目文件中。这个很重要。例如,如果您在一年后创建错误修复,那么您要确保使用与参考完全相同的版本来重建项目,这样才是真正的插件。如果参考部件已更改,则会出现错误。
但这并不总是可取的。一些程序员让程序集版本自动递增,从而在每次重建时生成一个新版本。即使程序集的公共接口从未更改。有些人使用Nuget来获取库来配置他们的项目,并在有新版本发布时让它自动更新库。他们希望将“特定版本”属性设置为False,以抑制编译错误。
要了解后果非常重要,您确实需要重新部署程序的整个内部版本以避免发生意外。在运行时版本不匹配会使程序崩溃,并且只能通过<bindingRedirect>
.config文件中的带有风险的抑制。
[AssemblyVersion]
当程序集未使用强名称签名时,CLR不考虑在内。