Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么有时我需要添加Nuget依赖项,即使它们是';你不直接被我的项目使用吗?_C#_Visual Studio_Nuget_.net 4.0 - Fatal编程技术网

C# 为什么有时我需要添加Nuget依赖项,即使它们是';你不直接被我的项目使用吗?

C# 为什么有时我需要添加Nuget依赖项,即使它们是';你不直接被我的项目使用吗?,c#,visual-studio,nuget,.net-4.0,C#,Visual Studio,Nuget,.net 4.0,很抱歉标题含糊不清,但我真的不知道如何简洁地表达它 我的问题是:我有一个.NET Framework C#解决方案,其中包含两个项目: projecta,一个引用Nuget包NP 项目B,一个C#应用程序,包括项目a作为项目参考 在项目A中,我有这样一种方法: public class FooClass { public static void Foo(){ //does something with a class from referenced Nuget pac

很抱歉标题含糊不清,但我真的不知道如何简洁地表达它

我的问题是:我有一个.NET Framework C#解决方案,其中包含两个项目:

  • projecta
    ,一个引用Nuget包
    NP
  • 项目B
    ,一个C#应用程序,包括
    项目a
    作为项目参考
项目A
中,我有这样一种方法:

public class FooClass {
    public static void Foo(){
        //does something with a class from referenced Nuget package "NP"
        NP.BarClass.Bar();
        return;
    }
}
public static void main(){
    FooClass.Foo();
}
public class FooClass
{
    public static void Foo(string x)
    {
        //Do something
        return;
    }

    public static void Foo(ClassFromNugetPackage np)
    {
        //Do something
        return;
    }
}
public class FooClass
{
    public static void Foo(string x)
    {
        //Do something
        return;
    }

    public static void Bar(ClassFromNugetPackage np) //Renamed method
    {
        //Do something
        return;
    }
}
项目B
中,我将上述方法称为:

public class FooClass {
    public static void Foo(){
        //does something with a class from referenced Nuget package "NP"
        NP.BarClass.Bar();
        return;
    }
}
public static void main(){
    FooClass.Foo();
}
public class FooClass
{
    public static void Foo(string x)
    {
        //Do something
        return;
    }

    public static void Foo(ClassFromNugetPackage np)
    {
        //Do something
        return;
    }
}
public class FooClass
{
    public static void Foo(string x)
    {
        //Do something
        return;
    }

    public static void Bar(ClassFromNugetPackage np) //Renamed method
    {
        //Do something
        return;
    }
}
但是,这会导致以下编译器错误:

类型“BarClass”是在未引用的程序集中定义的。你 必须添加对程序集“NP,Version=X.X.X.X”的引用, 区域性=中性,PublicKeyToken=XXXXXXXXXX'

正如编译器所建议的,解决方案是在项目B中添加对Nuget package NP的引用。当我这样做时,一切都按预期进行

我的问题是:

  • 为什么只有某些Nuget包才会出现这种情况?我一直在 现在与C#合作一段时间,但并非所有人都会这样 包裹,只有一些。例如,这一次它正在发生 带包装
    Microsoft.ReportingServices.ReportViewerControl.Winforms
    ,但我在其他nuget软件包中也看到过这种情况。然而,对于其他软件包,这根本不会发生。例如,我在同一个项目中使用了package
    ClosedXML
    ,它没有给我这个问题。为什么?
  • 为什么会发生这种情况?因为我的项目(
    projectb
    )不是 直接引用包NP中的任何类型或方法,为什么 必须明确地包括它吗?这还不够吗 包含在
    项目A
    中,使用它的人
编辑:我已经设法在一个独立的示例中重现了这个问题,请参见

为什么只有某些Nuget包才会出现这种情况?我一直在 现在与C#合作一段时间,但并非所有人都会这样 包裹,只有一些

由于您的问题很复杂,我们无法在我们这边测试整体,也许您可以遵循以下几点:

实际上,您的与框架版本包参考格式与特定nuget包
之间可能存在冲突

某些特定的nuget软件包安装在类库项目中,但当其他项目引用类库时,某些特定软件包的内容将与VS的旧框架版本冲突,因此您仍然需要引用主版本。只有通过添加此依赖项才能识别项目。这只是一些特殊包和框架版本的问题

另一个就像zivkan所说的,您应该保持包管理格式的一致性(
工具
-->
选项
-->
Nuget包管理器
-->
常规
-->
包管理
),以防止由于不同的管理格式而产生冲突。您应该确保项目A的输出文件(包括NP)位于项目B的输出文件中

为什么会发生这种情况?因为我的项目(项目B)不是 直接引用包NP中的任何类型或方法,为什么 必须明确地包括它吗?这还不够吗 项目A,使用它的那个


我假设您使用了旧的VS版本(
编辑:我已经重现了问题

好吧,在进一步的冗长和错误之后,我终于找到了问题的根源,让我告诉你:至少在我看来,这很奇怪

因此,这似乎只在某些情况下发生的原因是,这似乎还有进一步的要求。特别是,您必须有一个重载方法,该方法具有相同数量的参数,这些参数要么返回,要么接受有关nuget包中的参数类型

在我的例子中,
ProjectA
中的
FooClass
是这样的:

public class FooClass {
    public static void Foo(){
        //does something with a class from referenced Nuget package "NP"
        NP.BarClass.Bar();
        return;
    }
}
public static void main(){
    FooClass.Foo();
}
public class FooClass
{
    public static void Foo(string x)
    {
        //Do something
        return;
    }

    public static void Foo(ClassFromNugetPackage np)
    {
        //Do something
        return;
    }
}
public class FooClass
{
    public static void Foo(string x)
    {
        //Do something
        return;
    }

    public static void Bar(ClassFromNugetPackage np) //Renamed method
    {
        //Do something
        return;
    }
}
现在,在
ProjectB
中,我只调用了第一个方法,即带有
string
参数的方法,但这给了我一个错误,即使项目没有直接引用nuget包中的任何类

但是,如果我重命名第二个方法,则它不再是重载,如下所示:

public class FooClass {
    public static void Foo(){
        //does something with a class from referenced Nuget package "NP"
        NP.BarClass.Bar();
        return;
    }
}
public static void main(){
    FooClass.Foo();
}
public class FooClass
{
    public static void Foo(string x)
    {
        //Do something
        return;
    }

    public static void Foo(ClassFromNugetPackage np)
    {
        //Do something
        return;
    }
}
public class FooClass
{
    public static void Foo(string x)
    {
        //Do something
        return;
    }

    public static void Bar(ClassFromNugetPackage np) //Renamed method
    {
        //Do something
        return;
    }
}
问题消失了


如果有人能告诉我这背后的逻辑,我会很高兴。我的意思是,方法重载在编译时得到解决,对吗?编译器应该知道我调用的方法版本不会从nuget包返回/接受内容…那么为什么会出错?

我在EntityFramework中也看到了这一点。我真的很讨厌它违反encapsulation.Project B不需要对Project A内部的工作方式了解太多。一个可能的原因是Project B不是SDK样式的项目,Project A使用PackageReference而不是packages.config引入包。另一个可能的原因不会导致您提供的示例出现编译器错误。要创建解释所有可能原因的答案需要一篇大型博客文章,或者一个多篇博客系列。如果没有关于您的具体示例的更多详细信息,我无法回答。是不是
NP
nuget包是您自己创建的?我在
nuget.org
中没有找到它。另外,您的VS版本和特定框架版本是什么关于这两个项目?@PerryQian MSFT:这只是一个让问题变得一般化的例子。我遇到了各种软件包的问题,最后一个问题是Microsoft.ReportingServices.ReportViewerControl.Winforms
@zivkan:它们都使用
packages.config
来管理软件包,而不是PackageReference我使用的是VS2019,b