为什么在NuGet和Visual Studio之间添加不同的C#引用

mel*_*ers 10 c# reference nuget

我们使用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>
Run Code Online (Sandbox Code Playgroud)

如果我们在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>
Run Code Online (Sandbox Code Playgroud)

请注意,其中一个使用PublicKeyToken属性添加引用,另一个使用processorArchitecture属性添加它.

这会导致我们的源代码控制出现频繁(和不必要)更新和合并的问题.

很高兴知道为什么会发生这种情况,但我宁愿有办法防止它发生.有什么建议?

Bob*_*ger -4

我做了一些研究。并决定发布答案。

PublicKeyToken = null为您提供有关 CLR 正在查找未签名程序集的信息。

  • .net 中的程序集是什么?

程序集构成了基于 .NET 的应用程序的部署、版本控制、重用、激活范围和安全权限的基本单元。程序集采用可执行 (.exe) 文件或(在本例中) 动态链接库 (.dll) 文件的形式 ,并且是 .NET Framework 的构建块。

  • 什么是公钥令牌?

公钥令牌是一个小数字,是代表公钥的方便“令牌”。公钥相当长;公钥令牌的目的是让您在不说出整个密钥的情况下引用密钥。就像《指环王》这五个词代表了一部五十万字的小说。如果每次想讲都得说出那五十万字的话,那就很不方便了。

当我们知道程序集和公钥令牌的定义时,我们就可以谈论它们。

当您添加对项目的引用时,它们看起来会有所不同。

  • 为什么 ?是什么导致了这种差异?

添加文件引用。属性面板中Specific Version的初始值为False。csproj 文件看起来像

<Reference Include="Name">
  <HintPath>...</HintPath>
</Reference>
Run Code Online (Sandbox Code Playgroud)

将“属性”窗格中的“特定版本”更改为“True”。VS 在 Include 属性中添加版本。

<Reference Include="Name, Version=...">
  <HintPath>...</HintPath>
</Reference>
Run Code Online (Sandbox Code Playgroud)

再次将属性窗格中的特定版本更改为 False。VS 添加一个子元素 SpecificVersion。

<Reference Include="Name, Version=...">
  <HintPath>...</HintPath>
  <SpecificVersion>False</SpecificVersion>
</Reference>
Run Code Online (Sandbox Code Playgroud)

所以最终的定义似乎是:

您获得哪种引用类型取决于您链接程序集的方式。

您的问题来自不兼容的程序集。不是从你引用它们的方式来看的。

  • 我不买这个。它是在 csproj 文件中获取两种不同参考格式的同一程序集。唯一的区别在于添加引用的工具。NuGet 可执行文件(通过命令行)或 NuGet 包管理器(通过 Visual Studio 2015)。 (3认同)