簡體   English   中英

為什么 C# 引用在 NuGet 和 Visual Studio 之間添加不同

[英]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 中的程序集是什么?

程序集構成了基於 .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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM