C# 在.NET Framework中使用.NET标准库时获取正确的依赖项版本
考虑以下场景:C# 在.NET Framework中使用.NET标准库时获取正确的依赖项版本,c#,.net,visual-studio,nuget,.net-standard,C#,.net,Visual Studio,Nuget,.net Standard,考虑以下场景: 您的解决方案中有一个针对netstandard20的项目“X” ProjectX依赖于一个外部nuget包“ENP”,该包的netstandard和netframework版本不同。当您将ENP添加到projectx时,您将获得netstandard版本 您在针对.NET Framework 4.7的解决方案中有一个项目“Y”。本项目参考项目X,因此也需要参考ENP。但是,如果您将ENP作为nuget包添加到此项目中,您将获得.NET Framework版本而不是.NET标准版本
对于您遇到的行为
Y没有直接的依赖关系,但是“让X做”没有任何作用。编译时没有复制文件,我认为这可能是因为您当前的项目没有使用PackageReference
格式
有两种格式可以管理nuget包,Package.config
和PackageReference
。所有.net标准和.net核心
项目都使用PackageReference格式,而面向.net framework
的项目可以使用或格式化。如果.net framework项目选择packages.config
来管理nuget包,则在生成后,我们无法从ENP
包中找到文件,因为当前项目和引用的X
项目不使用相同的管理格式。为此,请创建一个使用packageReference的新项目,或将其添加到当前项目的(packages config)项目文件中:
<PropertyGroup>
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
</PropertyGroup>
包装参考
确保此项目和引用的X项目使用相同的PackageReference
格式,然后您会发现“让X做”满足了您的需要
我认为上面的脚本将解决您的第一个问题,然后我们不需要继续基于第一个问题的第二个场景。希望它能有所帮助:)除非项目Y对ENP有直接的依赖关系,否则您不应该包括NuGet引用-让X为您这样做。否则,您所描述的问题与一个.NET应用程序依赖于多个DLL和第三方LIB,其中两个恰好与不同版本的log4net进行了显式绑定的场景没有什么不同……现在假设Y确实直接依赖于ENP,那么您所描述的问题类似于我遇到了一个UWP项目。那里的解决方案是在添加其他NuGet引用之前,首先向所有项目添加对第三方NuGet包的显式引用(即使该库包含在我即将添加的其他NuGet包中)。这确保了使用的是我想要的版本,而不是其他NuGet-libs版本,并且没有直接的依赖关系,但是“让X做”没有任何作用。文件在编译时不会被复制。“…文件在编译时不会被复制…”-hmm这是不寻常的为什么会因为它使用程序集的.NET Framework版本而不是.NET标准而崩溃?在我看来,这两种方法中的任何一种都没有很好地编写(不同TFM的程序集应该是API兼容的)。如果这超出了您的控制范围,那么您需要将X多目标设置为netstandard2.0和net47,并使用#If net47
#else
在您自己的包中编译不同的代码,具体取决于每个TFM的TFM和ENP API。据我所知,NuGet正在按设计工作。