程序集引用的“特定版本”属性在Visual Studio中如何工作?

herzbube:

今天,我仔细研究了Visual Studio 2010中程序集引用的“特定版本”属性。在进行了一些意想不到的结果的实验​​之后,我开始尽可能多地了解该属性的工作方式。在我看来,即使如此,也无法提供所有答案,因此,这是我尝试自我回答的问题:

如何准确地做在Visual Studio程序集引用作品的“特定版本”属性?

herzbube:

这是一个编译时属性!

其中一个知道的最重要的事情是,“特定版本”是,需要在效果的属性编译时运行时。

这是什么一回事呢?

生成项目时,需要解析该项目的程序集引用,以便找到构建系统应使用的物理程序集。如果执行了“特定版本”检查(请参阅“何时检查“特定版本”?”部分),这会影响程序集解析过程的结果:

  • 生成系统查找可能使用的物理程序集
  • 生成系统将物理程序集的版本与.csproj文件中存储的程序集版本进行比较,以供程序集引用
  • 如果两个程序集版本完全相同,则解析过程成功,并将找到的物理程序集用于构建
  • 如果两个装配体版本不匹配,则将放弃物理装配体,并通过查找下一个潜在装配体继续进行解析过程
  • 如果找不到更多潜在的物理程序集,则解析过程将失败。这将导致编译器警告(警告MSB3245),该警告告诉您无法解析该引用。
  • 有趣的是,构建然后继续!如果代码没有对程序集的实际引用,则构建成功(带有前面提到的警告)。如果代码具有引用,则构建将失败,并显示一个错误,看起来好像该代码正在使用未知类型或名称空间。生成真正失败的唯一迹象是警告MSB3245。

解决装配的顺序

程序集解析过程查找潜在程序集的顺序似乎是这样的:

  1. <HintPath>.csproj文件中元素引用的程序集
  2. 项目输出路径
  3. GAC

请注意,如果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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何让clang格式在Visual Studio中工作

如何使wcsftime在Visual Studio CRT中工作?

Visual Studio中的“发布”如何工作?

如何使用Visual Studio Code引用程序集?

在Visual Studio中工作

如何在Visual Studio Code中添加程序集引用?

如何在Visual Studio Mac中添加对程序集的引用?

如何修复引用特定NuGet软件包提供的dll版本的托管C ++程序集(VS2017)

如何在 Visual Studio for C++ 中更改工作目录

在Visual Studio Code中运行python脚本;如何使“ input()”工作?

如何找到要明确引用的程序集的正确版本

Visual Studio Code 添加特定版本的包引用

版本化“规则”(程序集/文件)Visual Studio(C#)

Visual Studio 2019:Intellisense无法识别引用的程序集

移动项目时Visual Studio Nuget程序集引用损坏

Visual Studio Xamarin模板缺少程序集引用

Visual Studio Intellisense /“未引用程序集”问题

什么控制了NuGet包中引用的“特定版本”属性?

如何在Visual Studio WPF中绑定“发布版本”属性

如何让 Visual Studio Developer Powershell 在 Visual Studio Code 的集成终端中工作?

如何在Visual Studio 2015中从Git获取特定版本?

Visual Studio 如何设置依赖于程序集版本的输出路径

在Visual Studio中的小型团队中工作的项目引用?

如何在不使用Visual Studio的情况下引用程序集(* .dll)?

Visual Studio '17 未在引用管理器中显示程序集

如何使EnumMember在Visual Studio 2015中的ASP.net 5中工作

Visual Studio的TypeScript文件的隐式引用应该如何工作?

如何在R Studio中引用文件以进行本地Shiny应用程序开发而无需更改工作目录

Visual Studio中的外部程序集文件