Использование 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 будет).