многоплатформенные нативные библиотеки в C # nuspec - PullRequest
0 голосов
/ 12 октября 2018

У нас есть проект на C # (.net Core), который является кроссплатформенным.Он использует собственные библиотеки (C ++), которые различны для каждой платформы.

Мы знаем, что вы можете указать разные рамки в одном файле nuspec, но этот случай отличается:

  • Будет один DLL-файл C #
  • Будут разные нативные библиотеки (например, a.linux.so и a.windows.dll)

Мы хотим иметь возможность устанавливать толькобиблиотеки, относящиеся к конкретной ОС.

Какой механизм рекомендуется?

1 Ответ

0 голосов
/ 12 октября 2018

Во-первых, убедитесь, что вы используете проекты на основе SDK, чтобы обеспечить правильное усечение зависимостей для целевых сред, таких как netstandard* (вместо использования файла .nuspec).

Цель состоит в том, чтобы отделитьвстроенные ресурсы среды выполнения в подпапку runtimes внутри папки NuGet, чтобы макет был:

\lib\YourManagedCode.dll
\runtimes\win-x86\native\some.dll
\runtimes\win-x64\native\some.dll
\runtimes\linux-x64\native\libsome.so
\runtimes\osx-x64\native\some.dylib

Пример файла проекта может выглядеть следующим образом, при условии, что у вас уже есть папка среды выполнения:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <None Update="runtimes\**" Pack="true" PackagePath="runtimes" />
  </ItemGroup>
</Project>

Если вам нужно выполнить локальное тестирование, вы также можете добавить CopyToOutputDirectory="PreserveNewest", чтобы обеспечить копирование файлов в выходной файл..NET Core должен иметь возможность разрешать файлы, расположенные в каталогах среды выполнения, для методов, помеченных [DllImport("some")].

На полученный пакет NuGet можно ссылаться как из проектов .NET Core, так и .NET Framework.Если какой-то «запасной вариант RID» (например, win10-x64 => win-x64) не работает в проектах .NET Framework, убедитесь, что этот проект также ссылается на последнюю версию пакета Microsoft.NETCore.Platforms (он предоставляет NuGet графикизвестные значения, не имеет ничего общего с самим .NET Core ..).

...