[英]Why are C# references added differently between NuGet and Visual Studio
我们以两种不同的方式使用 NuGet(NuGet 版本:3.5.0.1996)。 我们可以从命令行运行它,也可以使用 Visual Studio (2015) 中的 NuGet 包管理器。
问题是这两种方式添加对.csproj 文件的引用格式不同。 如果我们使用命令行,我们会得到一个如下所示的引用:
<Reference Include="Dummy, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
<HintPath>..\packages\Dummy.1.27.10\lib\net452\Dummy.dll</HintPath>
<Private>True</Private>
</Reference>
如果我们在 Visual Studio 中使用 NuGet 包管理器,我们会得到一个如下所示的引用:
<Reference Include="Dummy, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Dummy.1.27.10\lib\net452\Dummy.dll</HintPath>
<Private>True</Private>
</Reference>
请注意,其中一个添加了带有 PublicKeyToken 属性的引用,另一个添加了带有 processorArchitecture 属性的引用。
这会导致我们的源代码管理出现问题,频繁(和不必要的)更新和合并。
很高兴知道为什么会发生这种情况,但我更希望有一种方法来防止它发生。 有什么建议么?
从 Visual Studio 2015 开始,Nuget 是嵌入式的,您无法更改所使用的版本。 我手边没有要检查的 VS 2015,但很可能它使用的版本与您在命令行中使用的版本不同。
Nuget“遭受”(或享受)了很多变化,我认为这只是两个不同版本的 nuget 如何处理包引用的体现。
为了避免源代码管理出现问题,我的建议是标准化一种使用 Nuget 的方法并坚持使用。 我的建议是通过包管理器控制台(类似于 CLI)或通过可视化界面在 Visual Studio 中使用它。
我做了一点研究。 并决定发布答案。
PublicKeyToken = null
为您提供有关 CLR 正在寻找未签名程序集的信息。
程序集构成了基于 .NET 的应用程序的部署、版本控制、重用、激活范围和安全权限的基本单元。 程序集采用可执行 (.exe) 文件或(在本例中)动态链接库 (.dll) 文件的形式,并且是 .NET Framework 的构建块。
公钥令牌是一个小数字,是一个方便的“令牌”,代表一个公钥。 公钥很长; 公钥令牌的目的是让您在不说出整个密钥的情况下引用密钥。 有点像说“指环王”是五个词,代表一部 50 万字的小说。 要是每次说起来都得说那五十万字,那就太不方便了。
当我们知道程序集和公钥令牌的定义时,我们就可以谈论它们。
当您添加对项目的引用时,它们看起来会有所不同。
添加文件引用。 Properties面板中Specific Version的初始值为False。 csproj 文件看起来像
<Reference Include="Name">
<HintPath>...</HintPath>
</Reference>
将属性窗格中的特定版本更改为 True。 VS 在 Include 属性中添加版本。
<Reference Include="Name, Version=...">
<HintPath>...</HintPath>
</Reference>
再次将属性窗格中的特定版本更改为 False。 VS 添加了一个子元素 SpecificVersion。
<Reference Include="Name, Version=...">
<HintPath>...</HintPath>
<SpecificVersion>False</SpecificVersion>
</Reference>
所以最终的定义似乎是:
您获得的引用类型取决于链接程序集的方式。
您的问题来自不兼容的程序集。 不是从你引用它们的方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.