C# 为什么有时我需要添加Nuget依赖项,即使它们是';你不直接被我的项目使用吗?
很抱歉标题含糊不清,但我真的不知道如何简洁地表达它 我的问题是:我有一个.NET Framework C#解决方案,其中包含两个项目: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
,一个引用Nuget包projecta
NP
,一个C#应用程序,包括项目B
作为项目参考项目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#合作一段时间,但并非所有人都会这样
包裹,只有一些。例如,这一次它正在发生
带包装
,但我在其他nuget软件包中也看到过这种情况。然而,对于其他软件包,这根本不会发生。例如,我在同一个项目中使用了packageMicrosoft.ReportingServices.ReportViewerControl.Winforms
,它没有给我这个问题。为什么?ClosedXML
- 为什么会发生这种情况?因为我的项目(
)不是 直接引用包NP中的任何类型或方法,为什么 必须明确地包括它吗?这还不够吗 包含在projectb
中,使用它的人项目A
工具
-->选项
-->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