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标准版本

考虑以下场景:

  • 您的解决方案中有一个针对netstandard20的项目“X”
  • ProjectX依赖于一个外部nuget包“ENP”,该包的netstandard和netframework版本不同。当您将ENP添加到projectx时,您将获得netstandard版本
  • 您在针对.NET Framework 4.7的解决方案中有一个项目“Y”。本项目参考项目X,因此也需要参考ENP。但是,如果您将ENP作为nuget包添加到此项目中,您将获得.NET Framework版本而不是.NET标准版本,您的应用程序将崩溃
  • 据我所知,没有办法强迫nuget获得正确的版本。手动添加正确引用的唯一解决方案是什么

    现在,第二个场景是:您希望通过nuget包分发ProjectX。当人们安装它时,他们也会自动安装依赖项ENP。如何确保nuget获取正确的版本?你不能要求其他人手动添加正确的依赖项

    对于ProjectX来说,有多个构建目标是正确的解决方案吗

    此项目引用项目X,因此也需要 参考ENP

    如果您的项目不直接依赖于ENP,那么您的项目实际上不需要引用ENP。就像上面提到的MickyD和Zivkan一样,nuget正在按照您的场景设计工作


    对于您遇到的行为
    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正在按设计工作。