簡體   English   中英

為什么有時我需要添加 Nuget 依賴項,即使它們沒有被我的項目直接使用?

[英]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 的引用 當我這樣做時,一切都按預期工作。

我的問題是:

  • 為什么這只發生在某些 Nuget 封裝中? 我已經使用 C# 有一段時間了,並不是所有的軟件包都會發生這種情況,只有其中一些。 例如,這一次發生在 package 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.

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