如何在 net472 上正确打包和使用具有多个运行时的 .NET Standard 库?

How to properly package and consume .NET Standard library with multiple runtimes on net472?

我正在尝试为 Python.NET 制作一个多平台包,目标是 .NET Standard 2.0,使用 this project

我设法创建了一个具有以下结构的 NuGet 包:

ref
|- netstandard2.0
 |- Python.Runtime.dll
runtimes
|- win
 |- lib
  |- netstandard2.0
   |- Python.Runtime.dll
|- linux-x64
 |- ...

此包与测试应用程序完美配合,基于新的 .csproj 格式 + PackageReferece,但前提是我的目标是 netcoreappX.X。在这种情况下,它将整个 runtimes 文件夹复制到 dotnet publish 和 运行 上的输出而不会出现问题。

如果我将 TargetFramework 更改为 net472,Windows 上的 dotnet builddotnet publish 都无法从中复制任何版本的 Python.Runtime.dll包,导致 FileNotFoundException: Could not load file or assembly 'Python.Runtime, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.

尝试从 Visual Studio 到 运行 时引发相同的异常。

异常实际上是有道理的,因为我可以看到程序集没有复制到输出目录。

现在的问题是以下哪项是问题所在,我该如何解决:

  1. 我的 .nuget 包缺少一些东西,所以没有为 net472 目标选择任何东西(尽管我希望它只是使用 netstandard2.0 东西)
  2. 我的测试应用程序 .csproj 缺少一些东西(也许我需要在 .csproj 中指定所有支持的 运行 次?)
  3. 工具根本不支持这样的设置

如果有解决上述问题的方法,它是否也适用于使用 packages.config 的旧式 .NET Framework 项目?

正如 Oren Novotny 在 https://github.com/dotnet/cli/issues/10806 中所建议的,有两点很重要。

dotnet rundotnet publishnet4xx 目标一起使用时,在这种情况下,必须指定 --runtime

对于 dotnet publish,通用的似乎没问题:dotnet run -r win

对于 dotnet run 我必须指定一个具体的:dotnet run -r win7-x64

为了避免这种情况,除了当前内容(尚未尝试)之外,我还必须将 lib/net4XX/ 添加到包中。