Wenn Sie das Copy
Ziel in der Zieldatei zum Kopieren der erforderlichen Bibliotheken verwenden, werden diese Dateien nicht in andere Projekte kopiert, die auf das Projekt verweisen DllNotFoundException
. Dies kann jedoch mit einer viel einfacheren Zieldatei unter Verwendung eines None
Elements erfolgen, da MSBuild alle None
Dateien in referenzierende Projekte kopiert .
<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>
Fügen Sie die Zieldatei build
zusammen mit den erforderlichen nativen Bibliotheken zum Verzeichnis des Nuget-Pakets hinzu. Die Zieldatei enthält alle dll
Dateien in allen untergeordneten Verzeichnissen des build
Verzeichnisses. Wenn Sie also eine x86
und x64
-Version einer nativen Bibliothek hinzufügen, die von einer Any CPU
verwalteten Assembly verwendet wird, erhalten Sie eine Verzeichnisstruktur, die der folgenden ähnelt:
- bauen
- x86
- NativeLib.dll
- NativeLibDependency.dll
- x64
- NativeLib.dll
- NativeLibDependency.dll
- MyNugetPackageID.targets
- lib
Das gleiche x86
und x64
Verzeichnisse werden beim Erstellen im Ausgabeverzeichnis des Projekts erstellt. Wenn Sie keine Unterverzeichnisse benötigen, können die **
und %(RecursiveDir)
entfernt werden und stattdessen die erforderlichen Dateien build
direkt in das Verzeichnis aufnehmen. Auf die gleiche Weise können auch andere erforderliche Inhaltsdateien hinzugefügt werden.
Die wie None
in der Zieldatei hinzugefügten Dateien werden beim Öffnen in Visual Studio nicht im Projekt angezeigt. Wenn Sie sich fragen, warum ich den Content
Ordner im nupkg nicht verwende, liegt dies daran, dass es keine Möglichkeit gibt, das CopyToOutputDirectory
Element ohne Verwendung eines Powershell-Skripts festzulegen (das nur in Visual Studio ausgeführt wird, nicht über die Eingabeaufforderung, auf Build-Servern oder in andere IDEs und wird in project.json / xproj-DNX-Projekten nicht unterstützt. Ich bevorzuge die Verwendung von a Link
für die Dateien, anstatt eine zusätzliche Kopie der Dateien im Projekt zu haben.
Update:
Obwohl dies auch funktionieren sollte, Content
anstatt None
dass es einen Fehler in msbuild gibt, werden Dateien nicht mehr als einen Schritt entfernt in Referenzprojekte kopiert (z. B. proj1 -> proj2 -> proj3, proj3 erhält die Dateien nicht aus dem NuGet-Paket von proj1, aber proj2 wird).