簡體   English   中英

Visual Studio正在尋找一個沒有publicKeyToken的舊Nuget包

[英]Visual Studio is looking for an old Nuget Package with no publicKeyToken

我的項目中有一個Nuget包,以前是未簽名的,沒有強名稱。

我已經發布了一個現在簽名的新版軟件包。

當我將新版本的Nuget包添加到我的解決方案時,項目中引用Nuget包中的程序集的任何位置都會導致以下構建錯誤:

錯誤CS0012類型“JsonWebToken”在未引用的程序集中定義。 您必須添加對程序集“TSC.Business.DataContracts,Version = 2.10.6.0,Culture = neutral,PublicKeyToken = null”的引用。

如您所見,編譯器仍然期望沒有PublicKeyToken的程序集版本。

我需要嘗試確定為什么編譯器仍然期望此包的publicKeyToken為null。

我嘗試過的事情 - 一切都沒有運氣:

  • 通過從packages.json,packages目錄,csproj文件,bin路徑中刪除舊版本並運行完全清理來完全卸載舊的Nuget包。

  • 驗證packages.json中新版本的publicKeyToken是否正確 - 它是

  • 清除我的臨時ASP.Net文件

  • 哎呀,甚至安裝VS2019並檢查那里是否存在問題 - 它確實存在

有沒有人知道編譯器可以在哪里尋找這個null的publicKeyToken?

從項目目錄開始,在磁盤上查找project.assets.json 它可能位於obj目錄中。 如果找到它,請刪除它以及名為*.*proj.nuget.*所有其他文件。 這些將在下一個有用的構建中重新生成。

NuGet包是設計不可變的。 這意味着它的包含內容(我的意思是特定版本的包ID)無論如何都會因為任何原因而改變。 當您開始對程序集進行強名稱簽名時,您應該已經更改了程序包版本。 我的猜測是你沒有,如果這是正確的,你就會收到錯誤,因為NuGet利用了包的不變性和積極的緩存。

當您談到packages文件夾時,我假設您指的是使用packages.config項目解決方案的解決方案包文件夾。 NuGet還有一個全局包文件夾。 如果確實需要更改軟件包版本的內容,則需要從全局軟件包版本中刪除舊內容。 但請記住,每個恢復第一個包的人都會遇到同樣的問題,需要刪除他們的全局包文件夾。 因此,無論何時進行任何更改,都必須更改軟件包的版本。 如果您需要在最終版本制作之前生成用於測試的包,請利用語義版本控制的預發布標簽。

我錯誤地回答了我在其他答案中提出的問題,但實際上是在閱讀錯誤信息時,很明顯所遇到的問題是由你認為的其他問題引起的。 我決定保留我的另一個答案,因為我已經看過很多次人們試圖改變他們已經用於測試的軟件包版本的內容而不理解為什么他們在嘗試使用更新的軟件包時看不到他們的更改。 無論如何,強名稱簽名程序集只能對其他強名稱簽名程序集具有引用/依賴關系,這意味着您的項目仍然引用一些非強名稱簽名的程序包(或者可能是項目引用,我不記得是否可以與packages.config項目一起發生,它不應該與PackageReference )。 但正如錯誤消息所示,您的項目當前沒有引用TSC.Business.DataContracts, Version=2.10.6.0, Culture=neutral, PublicKeyToken=null

快速確定項目正在使用哪個程序集的方法之一就是強名稱簽名項目。 雖然這意味着您使用的所有軟件包都必須使用強名稱簽名,但如果您使用任何非強名稱簽名的第三方軟件包,則無法使用。 無論如何,如果你這樣做,你會得到這個錯誤:

MSB3188:程序集“<assembly>”必須是強簽名才能標記為先決條件。

相反,您看到的錯誤是“類型'JsonWebToken'在未引用的程序集中定義”。 這意味着您正在引用一個程序集(我假設來自一個包),該程序集具有返回JsonWebToken類型的對象的方法或屬性,並且在您的代碼中使用了var jwt = 這會導致項目在定義該類型的程序集上具有程序集依賴項(與程序包相關性不同),但定義該類型的程序集未使用/r參數傳遞給編譯器。 除非您自己運行csc.exe,否則這意味着您的項目無法通過項目或包引用獲取引用。

原因可能是使用未正確聲明其自身nuget依賴關系的包,或者您的項目可能正在使用packages.config並且項目引用使用TSC.Business.DataContracts, Version=2.10.6.0, Culture=neutral, PublicKeyToken=null 如果您的項目使用的是PackageReference ,那么所有依賴項都是可傳遞的,這意味着如果您引用使用包的項目,那么這些包也將自動提供給您的項目。 我不認為,同樣是真正的packages.config項目,但我不知道到底是否ResolveAssemblyReferences在構建發生之前或運行后CSC.EXE。

假設它是一個包問題,而不是一個傳遞項目引用問題,當包作者使用nuspec文件來創建它們的包,因為它容易出錯時,就會發生這種情況。 這就是為什么NuGet團隊強烈建議使用SDK樣式項目(他們可以針對.NET Framework,他們不僅限於.NET Core和.NET Standard),並使用沒有nuspec的dotnet pack來自動打包所有內容。 NuGet依賴項會自動添加,因此無法實現包創作錯誤的類型。 如果使用nuspec打包包,請考慮切換到SDK樣式項目並停止使用nuspec,否則請仔細檢查包以確保它們具有正確的依賴關系( nuget.exe pack可以自動為包和項目引用添加NuGet依賴項,但它更容易出錯)。

也許我應該在這里停止我的信息,但還有另一種可能性不太可能。 我希望簡單地解釋一下,它不僅僅是幫助而是混淆。 由於您說在啟動強名稱簽名時確實增加了包版本號,我希望這意味着您還增加了程序集版本號。 如果是這樣,那么您應該知道版本2.10.6.0是否應該是強名稱簽名。 如果它應該是,那么您在構建和打包TSC.Business.DataContracts或您的項目正在使用的任何包依賴於TSC.Business.DataContracts時也遇到問題,因為顯然它使用的是未簽名的dll版本。 如果版本2.10.6.0是預簽名版本,那么您的項目正在使用針對此舊版TSC.Business.DataContracts編譯的軟件包,盡管該軟件包錯誤地無法聲明對任何軟件包提供的nuget依賴性提供TSC.Business .DataContracts.dll。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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