[英]Why do I sometimes need to add a nuget package to the actual project that's being run
[英]Why do I sometimes need to to add Nuget dependencies even if they're not used directly by my project?
抱歉標題含糊不清,但我真的不知道如何簡潔地表達它。
這是我的問題:我有一個 .NET 框架 C# 解決方案,其中有 2 個項目:
Project A
,一個 C# 庫,它引用 Nuget package NP
Project B
,一個 C# 應用程序,其中包括Project A
作為項目參考在Project A
中,我有一個這樣的方法:
public class FooClass {
public static void Foo(){
//does something with a class from referenced Nuget package "NP"
NP.BarClass.Bar();
return;
}
}
在Project B
中,我調用上述方法,如下所示:
public static void main(){
FooClass.Foo();
}
但是,這會產生以下編譯器錯誤:
'BarClass' 類型是在未引用的程序集中定義的。 您必須添加對程序集 'NP, Version=XXXX, Culture=neutral, PublicKeyToken=xxxxxxxxxxx' 的引用
正如編譯器所建議的那樣,解決方案是在 Project B 中添加對 Nuget package NP 的引用。 當我這樣做時,一切都按預期工作。
我的問題是:
Microsoft.ReportingServices.ReportViewerControl.Winforms
中,但我已經看到其他 nuget 包也發生這種情況。 但是,對於其他軟件包,這根本不會發生。 例如,我在同一個項目中使用了 package ClosedXML
,它沒有給我這個問題。 為什么?Project B
)沒有直接引用 package NP 中的任何類型或方法,為什么我必須明確包含它? 將它包含在使用它的Project A
中還不夠嗎?編輯:我已經設法在一個獨立的例子中重現了這個問題,見這里
為什么這只發生在某些 Nuget 封裝中? 我已經使用 C# 有一段時間了,並不是所有的軟件包都會發生這種情況,只有其中一些。
由於您的問題很復雜,我們無法在我們這邊進行整體測試,也許您可以遵循這些:
實際上,您的VS 框架版本或package 參考格式與特定的 nuget 包之間確實存在沖突的可能性。
class庫項目中安裝了一些特定的nuget包,但是當其他項目引用class庫時,某些特定包的內容會與舊框架版本的項目沖突,所以您仍然需要參考VS的舊框架版本,只能通過添加此依賴項來識別。 而這只是一些特殊包和框架版本的問題。
And another is just like zivkan said, you should keep package management format consistent( Tools
--> Options
--> Nuget Package Manager
--> General
--> Package Management
) to prevent conflicts due to different management formats. 您應該確保項目 A 的 output 文件(包括NP )在項目 B 的 output 文件中。
為什么會發生這種情況? 由於我的項目(項目 B)沒有直接引用 package NP 中的任何類型或方法,為什么我必須明確包含它? 將它包含在使用它的項目 A 中還不夠嗎?
我假設您使用舊的 VS 版本( <=VS2017
)來創建此類項目。
一般來說,你真的不需要將這些包含在主項目(項目 B)中。
事實上,在VS2017或更早的版本中,以Project Reference的形式,確實存在一個問題,即class庫項目中依賴的nuget及其文件會在引用它的項目中丟失。 好在vs2019已經修復了這個問題。
所以如果你的情況是我所說的,我建議你可以使用最新的 VS2019 。
或者在較舊的 VS 版本中,使用您的解決方案-> 在項目 B 中添加 nuget。
在 VS2019 方面,我沒有遇到同樣的錯誤。
編輯:我在這里重現了這個問題
好吧,經過進一步的反復試驗,我終於找到了問題的根源,讓我告訴你:這很奇怪,至少在我看來。
所以,這似乎只在某些情況下發生的原因是因為這似乎有進一步的要求。 特別是,您必須有一個具有相同數量參數的重載方法,該方法返回或接受來自問題 nuget package 的類型作為參數。
就我而言, ProjectA
中的FooClass
是這樣的:
public class FooClass
{
public static void Foo(string x)
{
//Do something
return;
}
public static void Foo(ClassFromNugetPackage np)
{
//Do something
return;
}
}
現在,在ProjectB
中,我只調用第一種方法,即帶有string
參數的方法,但這給了我錯誤,即使項目沒有直接從 nuget ZEFE90A8E604A7C870E88D03A76 中引用任何 class
但是,如果我重命名第二種方法,那么它就不再是一個重載,像這樣:
public class FooClass
{
public static void Foo(string x)
{
//Do something
return;
}
public static void Bar(ClassFromNugetPackage np) //Renamed method
{
//Do something
return;
}
}
問題消失了!
如果有人能告訴我這背后的邏輯,我會很高興。 我的意思是,方法重載是在編譯時解決的,對吧? 編譯器應該知道我正在調用不返回/接受來自 nuget package 的內容的方法版本......那為什么會出錯?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.