Wenn Sie das CopyZiel 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 NoneElements erfolgen, da MSBuild alle NoneDateien 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 buildzusammen mit den erforderlichen nativen Bibliotheken zum Verzeichnis des Nuget-Pakets hinzu. Die Zieldatei enthält alle dllDateien in allen untergeordneten Verzeichnissen des buildVerzeichnisses. Wenn Sie also eine x86und x64-Version einer nativen Bibliothek hinzufügen, die von einer Any CPUverwalteten 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 x86und x64Verzeichnisse 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 builddirekt in das Verzeichnis aufnehmen. Auf die gleiche Weise können auch andere erforderliche Inhaltsdateien hinzugefügt werden.
Die wie Nonein der Zieldatei hinzugefügten Dateien werden beim Öffnen in Visual Studio nicht im Projekt angezeigt. Wenn Sie sich fragen, warum ich den ContentOrdner im nupkg nicht verwende, liegt dies daran, dass es keine Möglichkeit gibt, das CopyToOutputDirectoryElement 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 Linkfür die Dateien, anstatt eine zusätzliche Kopie der Dateien im Projekt zu haben.
Update:
Obwohl dies auch funktionieren sollte, Contentanstatt Nonedass 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).