Використання 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 буде).