L'utilisation de la Copy
cible 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 None
fichiers 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 build
répertoire du package nuget avec les bibliothèques natives requises. Le fichier cibles comprendra tous les dll
fichiers de tous les répertoires enfants du build
répertoire. Donc, pour ajouter une version x86
et x64
d'une bibliothèque native utilisée par un Any CPU
assembly 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 x86
et x64
seront 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 build
directement 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 None
dans 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 Content
dossier 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 Link
pour 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 Content
plutôt qu'il None
ne 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).