[英]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.