L'uso della Copydestinazione nel file target per copiare le librerie richieste non copierà quei file in altri progetti che fanno riferimento al progetto, risultando in a DllNotFoundException. Questo può essere fatto con un file target molto più semplice, usando un Noneelemento, poiché MSBuild copierà tutti i Nonefile in progetti di riferimento.
<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>
Aggiungi il file target alla builddirectory del pacchetto nuget insieme alle librerie native richieste. Il file target includerà tutti i dllfile in tutte le directory figlio della builddirectory. Quindi, per aggiungere una x86e una x64versione di una libreria nativa utilizzata da un Any CPUassembly gestito, si otterrebbe una struttura di directory simile alla seguente:
- costruire
- X 86
- NativeLib.dll
- NativeLibDependency.dll
- x64
- NativeLib.dll
- NativeLibDependency.dll
- MyNugetPackageID.targets
- lib
Lo stesso x86e le x64directory verranno create nella directory di output del progetto quando vengono create. Se non hai bisogno di sottodirectory, allora il **e il %(RecursiveDir)possono essere rimossi e invece includere direttamente i file richiesti nella builddirectory. Altri file di contenuto richiesti possono anche essere aggiunti allo stesso modo.
I file aggiunti come Nonenel file target non verranno mostrati nel progetto quando sono aperti in Visual Studio. Se ti stai chiedendo perché non uso la Contentcartella in nupkg è perché non c'è modo di impostare l' CopyToOutputDirectoryelemento senza usare uno script PowerShell (che verrà eseguito solo all'interno di Visual Studio, non dal prompt dei comandi, sui server di compilazione o in altri IDE e non è supportato nei progetti DNX project.json / xproj ) e preferisco utilizzare un Linkfile piuttosto che avere una copia aggiuntiva dei file all'interno del progetto.
Aggiornamento: anche
se questo dovrebbe funzionare anche Contentpiuttosto che Nonesembra che ci sia un bug in msbuild in modo che i file non vengano copiati nei progetti di riferimento più di un passaggio rimosso (ad esempio proj1 -> proj2 -> proj3, proj3 non otterrà i file dal pacchetto NuGet di proj1 ma proj2 lo farà).