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

时间:2017-07-13 18:48:32

标签: 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>

如果我们在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属性添加它。

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

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

2 个答案:

答案 0 :(得分:-1)

从 Visual Studio 2015 开始,Nuget 已嵌入,您无法更改使用的版本。我手头没有要检查的 VS 2015,但很可能它使用的版本与您在命令行中使用的版本不同。

Nuget 已经“遭受”(或享受)了很多变化,我认为这只是两个不同版本的 nuget 如何处理包引用的体现。

为了避免出现源代码控制问题,我的建议是标准化一种使用 Nuget 的方法并坚持下去。我的建议是在 Visual Studio 中使用它,通过包管理器控制台(类似于 CLI)或通过可视化界面。

答案 1 :(得分:-2)

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

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

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

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

  • 什么是公钥令牌?

公钥令牌是一个很小的数字,这是一个方便的标记&#34;代表公钥。公钥很长;公钥令牌的目的是让你在不说出整个密钥的情况下引用密钥。按照同样的方式说出“指环王”#34;是五个词,代表一个五十万字的小说。如果你每次想谈论它都会很不方便,你必须陈述那些50万字。

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

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

  • 为什么?什么可能导致差异?

添加文件参考。 “属性”面板中“特定版本”的初始值为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>

所以最终的定义似乎是:

您获得的参考类型取决于您如何链接程序集。

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