Как правильно упаковать и использовать библиотеку.NET Standard с несколькими средами выполнения на net472?

Я пытаюсь сделать мультиплатформенный пакет для Python.NET, ориентированный на.NET Standard 2.0, используя этот проект.

Мне удалось создать пакет 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, и то и другое dotnet build а также dotnet publish в Windows не удается скопировать любую версию 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. подобная установка не поддерживается инструментами вообще

Если есть решение вышеуказанной проблемы, будет ли это работать для проектов.NET Framework старого стиля с packages.config?

1 ответ

Решение

Как предложил Орен Новотный в https://github.com/dotnet/cli/issues/10806, есть две важные вещи.

Когда используешь dotnet run или же dotnet publish с net4xx цели, в этом случае --runtime должен быть указан.

За dotnet publish общий, кажется, хорошо: dotnet run -r win,

За dotnet run Я должен был указать конкретный: dotnet run -r win7-x64,

Чтобы избежать этого, я должен добавить lib/net4XX/ к пакету в дополнение к его текущему содержимому (еще не пробовал).

Другие вопросы по тегам