Використання Copyцілі у файлі цілі для копіювання потрібних бібліотек не копіює ці файли до інших проектів, на які посилається проект, в результаті чого з'являється a 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
- ліб
Ті самі x86та x64каталоги будуть створені у вихідному каталозі проекту, коли він буде створений. Якщо підкаталоги вам не потрібні, тоді **і ви %(RecursiveDir)можете видалити, і натомість включити потрібні файли buildбезпосередньо в каталог. Інші необхідні файли вмісту також можна додавати таким же чином.
Файли, додані як Noneу файлі цілі, не відображатимуться в проекті при відкритті в Visual Studio. Якщо вам цікаво, чому я не використовую Contentпапку в nupkg, це тому, що немає способу встановити CopyToOutputDirectoryелемент без використання скрипта powerhell (який буде запускатися тільки в Visual Studio, а не в командному рядку, на серверах побудови або в інших IDE і не підтримується в проектах DNX Project.json / xproj ), і я вважаю за краще використовувати Linkфайли a, а не мати додаткову копію файлів у проекті.
Оновлення:
Хоча це також має працювати, Contentа не Noneздається, що у msbuild є помилка, тому файли не будуть скопійовані до посилань на проекти, більш ніж один крок видалено (наприклад, proj1 -> proj2 -> proj3, proj3 не отримає файли з пакета NuGet proj1, але proj2 буде).