L'utilisation de la Copycible dans le fichier de cibles pour copier les bibliothèques requises ne copiera pas ces fichiers dans d'autres projets qui référencent le projet, ce qui entraînera un fichier DllNotFoundException. Cela peut être fait avec un fichier de cibles beaucoup plus simple, en utilisant un Noneélément, car MSBuild copiera tous les Nonefichiers pour référencer les projets.
<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>
Ajoutez le fichier de cibles au buildrépertoire du package nuget avec les bibliothèques natives requises. Le fichier cibles comprendra tous les dllfichiers de tous les répertoires enfants du buildrépertoire. Donc, pour ajouter une version x86et x64d'une bibliothèque native utilisée par un Any CPUassembly géré, vous vous retrouveriez avec une structure de répertoire similaire à la suivante:
- construire
- x86
- NativeLib.dll
- NativeLibDependency.dll
- x64
- NativeLib.dll
- NativeLibDependency.dll
- MyNugetPackageID.targets
- lib
Les mêmes répertoires x86et x64seront créés dans le répertoire de sortie du projet lors de la construction. Si vous n'avez pas besoin de sous-répertoires, les **et les %(RecursiveDir)peuvent être supprimés et inclure à la place les fichiers requis builddirectement dans le répertoire. D'autres fichiers de contenu requis peuvent également être ajoutés de la même manière.
Les fichiers ajoutés comme Nonedans le fichier cibles ne seront pas affichés dans le projet lorsqu'ils sont ouverts dans Visual Studio. Si vous vous demandez pourquoi je n'utilise pas le Contentdossier dans le nupkg, c'est parce qu'il n'y a aucun moyen de définir l' CopyToOutputDirectoryélément sans utiliser un script PowerShell (qui ne sera exécuté que dans Visual Studio, pas à partir de l'invite de commande, sur les serveurs de build ou dans autres IDE, et n'est pas pris en charge dans les projets project.json / xproj DNX ) et je préfère utiliser un Linkpour les fichiers plutôt que d'avoir une copie supplémentaire des fichiers dans le projet.
Mise à jour:
Bien que cela devrait également fonctionner avec Contentplutôt qu'il Nonene semble qu'il y ait un bogue dans msbuild, les fichiers ne seront donc pas copiés pour référencer les projets plus d'une étape supprimée (par exemple, proj1 -> proj2 -> proj3, proj3 ne recevra pas les fichiers du package NuGet de proj1 mais proj2 le fera).