Как использовать собственный пакет NuGet из управляемого проекта?

У меня есть управляемый проект, в котором используется собственная DLL в стиле C через P/Invoke.

Как правильно упаковать собственную библиотеку DLL, чтобы ее можно было добавить в качестве пакета NuGet в управляемый проект и автоматически скопировать библиотеку DLL в выходную папку?

В настоящее время я создал пакет с использованием CoApp для собственной DLL, но я не могу использовать его из управляемого проекта; Я получаю следующую ошибку при попытке добавить пакет:

Не удалось установить пакет «foo.redist 1.0.0». Вы пытаетесь установить этот пакет в проект, предназначенный для .NETFramework, Version=v4.5.1, но пакет не содержит ссылок на сборки или файлов содержимого, совместимых с этой платформой. Для получения дополнительной информации свяжитесь с автором пакета.

В настоящее время у меня есть только эти «стержни» в файле autopkg:

[Win32,dynamic,release] {
    bin: release\foo.dll;
}
[Win32,dynamic,debug] {
    bin: debug\foo.dll;
}

... мне нужно добавить что-то еще?


person Morten Fjeldstad    schedule 05.03.2015    source источник
comment
Вы когда-нибудь разбирали это с помощью CoApp?   -  person Edenhill    schedule 30.01.2017


Ответы (1)


Я в похожей ситуации. Я решил не использовать CoApp для этого проекта, а вместо этого создал новую комбинацию файлов nuspec/.targets.

В файле nuspec я использую элемент <files> для отображения собственных библиотек DLL.

В файле .targets у вас есть доступ к атрибуту условия msbuild, который позволяет изменять базовую конфигурацию. В нашем случае мы всегда развертываем 64-битные двоичные файлы, поэтому поворот платформы не нужен, но вы также можете добавить его, если это необходимо.

Я получаю предупреждения при запуске пакета nuget, поскольку двоичные файлы не находятся внутри lib, но в остальном он работает нормально.

Шаги:

  • запустите nuget spec в папке, содержащей ваш vcxproj
  • создайте папку .build, в этой папке создайте пустой файл mydll.targets (соответствуйте имени файла nuspec)
  • вручную заполнить файлы аналогично примерам ниже;

Пример mydll.nuspec:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
  ...your metadata here
</metadata>
<files>
  <file src="x64\Release\my.dll" target="x64\Release\my.dll" />
  <file src="x64\Debug\my.dll" target="x64\Debug\my.dll" />
</files>
</package>

Пример mydll.targets:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<None Include="$(MSBuildThisFileDirectory)\..\x64\Release\my.dll" Condition="'$(Configuration)'=='Release'">
  <Link>my.dll</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="$(MSBuildThisFileDirectory)\..\x64\Debug\my.dll"  Condition="'$(Configuration)'=='Debug'">
  <Link>my.dll</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
person Chris Bechette    schedule 21.03.2016