Использование Copyцели в целевом файле для копирования необходимых библиотек не приведет к копированию этих файлов в другие проекты, которые ссылаются на проект, в результате чего файл DllNotFoundException. Это можно сделать с помощью гораздо более простого файла целей, используя Noneэлемент, поскольку MSBuild скопирует все Noneфайлы в ссылающиеся проекты.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<NativeLibs Include="$(MSBuildThisFileDirectory)**\*.dll" />
<None Include="@(NativeLibs)">
<Link>%(RecursiveDir)%(FileName)%(Extension)</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
Добавьте целевой файл в buildкаталог пакета nuget вместе с необходимыми собственными библиотеками. Целевой файл будет включать все dllфайлы во всех дочерних каталогах buildкаталога. Таким образом, чтобы добавить x86и x64версию собственной библиотеки, используемой Any CPUуправляемой сборкой, вы получите структуру каталогов, подобную следующей:
- строить
- x86
- NativeLib.dll
- NativeLibDependency.dll
- x64
- NativeLib.dll
- NativeLibDependency.dll
- MyNugetPackageID.targets
- Lib
То же самое x86и x64каталоги будут создаваться в выходном каталоге проекта при встраивании. Если вам не нужны подкаталоги то **и %(RecursiveDir)могут быть удалены и вместо того, чтобы включать необходимые файлы в buildкаталоге непосредственно. Таким же образом можно добавить и другие необходимые файлы содержимого.
Файлы, добавленные Noneв качестве целевого файла, не будут отображаться в проекте при открытии в Visual Studio. Если вам интересно, почему я не использую Contentпапку в nupkg, это потому, что нет возможности установить CopyToOutputDirectoryэлемент без использования сценария PowerShell (который будет запускаться только внутри Visual Studio, а не из командной строки, на серверах сборки или в других IDE и не поддерживается в проектах DNX project.json / xproj ), и я предпочитаю использовать a Linkдля файлов, а не иметь дополнительную копию файлов в проекте.
Обновление:
хотя это также должно работать, Contentа не Noneпохоже, что в msbuild есть ошибка, поэтому файлы не будут копироваться в проекты, ссылающиеся на проекты, удаленные более чем на один шаг (например, proj1 -> proj2 -> proj3, proj3 не получит файлы из пакета NuGet proj1, но proj2 будет).