L'uso della Copy
destinazione 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 None
elemento, poiché MSBuild copierà tutti i None
file 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 build
directory del pacchetto nuget insieme alle librerie native richieste. Il file target includerà tutti i dll
file in tutte le directory figlio della build
directory. Quindi, per aggiungere una x86
e una x64
versione di una libreria nativa utilizzata da un Any CPU
assembly 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 x86
e le x64
directory 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 build
directory. Altri file di contenuto richiesti possono anche essere aggiunti allo stesso modo.
I file aggiunti come None
nel file target non verranno mostrati nel progetto quando sono aperti in Visual Studio. Se ti stai chiedendo perché non uso la Content
cartella in nupkg è perché non c'è modo di impostare l' CopyToOutputDirectory
elemento 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 Link
file piuttosto che avere una copia aggiuntiva dei file all'interno del progetto.
Aggiornamento: anche
se questo dovrebbe funzionare anche Content
piuttosto che None
sembra 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à).