Ich habe ein NuGet-Paket erstellt, das gut funktioniert, wenn ich es aus einem C # -Projekt verwende. Es enthält eine DLL im lib/net40
Verzeichnis und die DLL wird als Referenz hinzugefügt.
Wie ändere ich mein Paket, nachdem NuGet C ++ unterstützt, so, dass die DLL als verwaltete Referenz in einem C ++ / CLI-Projekt hinzugefügt werden kann? Ich kann keine Tutorials finden, die dies erklären. Wenn ich versuche, das Paket so wie es ist hinzuzufügen, erhalte ich die folgende Fehlermeldung:
Sie versuchen, dieses Paket in einem Projekt zu installieren, das auf "Native, Version = v0.0" abzielt, aber das Paket enthält keine Assemblyreferenzen oder Inhaltsdateien, die mit diesem Framework kompatibel sind.
Man könnte meinen, dass die Lösung darin besteht, die Dateien unter lib / native abzulegen, aber laut http://docs.nuget.org/docs/reference/support-for-native-projects wird dies nicht unterstützt. Außerdem scheint es nichts zu bewirken, die DLL einfach direkt unter lib zu stellen.
Anscheinend soll ich dies mit einer .props
oder .targets
-Datei unter build / native tun, aber was muss ich in diese Dateien einfügen, damit dies funktioniert?
Antworten:
Wie Patrick O'Hara schrieb , wird NuGet für Sie keine Änderungen an einem C ++ / CLI-Projekt vornehmen. Siehe GitHub-Problem NuGet / Home # 1121 - Verwaltete Pakete können nicht in ein CLI-Projekt installiert werden . Mit dem NuGet-Befehlszeilenprogramm
NuGet.exe
können Sie NuGet jedoch die gewünschten Pakete herunterladen und entpacken lassen.Als vollständiges Beispiel habe ich folgende Schritte ausgeführt, um einen Verweis auf OptimizedPriorityQueue 1.0.0 in einem Visual Studio 2013 C ++ / CLI-Projekt hinzuzufügen :
Installieren Sie in der Package Manager-Konsole das NuGet.CommandLine-Paket:
(Hinweis: Zum jetzigen Zeitpunkt ist die neueste Version von NuGet.CommandLine 2.8.6. Dies kann für Sie anders sein.)
In Ihrem Projektordner sollte sich jetzt eine
.nuget\packages.config
XML-Datei mit folgendem Inhalt befinden:<?xml version="1.0" encoding="utf-8"?> <packages> <package id="NuGet.CommandLine" version="2.8.6" /> </packages>
Fügen Sie in einem Texteditor wie Notepad ++ ein
<package>
Element für das gewünschte Paket hinzu. In diesem Fall habe ich hinzugefügt:<package id="OptimizedPriorityQueue" version="1.0.0" />
.. innerhalb des
<packages>
Elements.Öffnen Sie eine Eingabeaufforderung (Ich habe eine VS2013 Developer-Eingabeaufforderung geöffnet, aber eine reguläre Eingabeaufforderung sollte funktionieren.)
cd
in den Projektordner.Führen Sie den folgenden Befehl aus und ändern Sie die Versionsnummer von NuGet.CommandLine, falls abweichend:
Für mich war die Ausgabe:
packages
Unterverzeichnis Ihres Projektordners entpackt hat, und klicken Sie auf die Schaltfläche Hinzufügen . Klicken Sie auf OK , um das Dialogfeld Referenz hinzufügen zu schließen.Sie sollten nun in der Lage sein, die Assembly in Ihrem C ++ / CLI-Projekt zu verwenden:
using namespace Priority_Queue; //...
quelle
Es scheint tatsächlich eine Möglichkeit zu geben, die Installation und automatische Referenzierung "regulärer" NuGet-Pakete aus C ++ / CLI-Projekten mithilfe der folgenden Schritte (zumindest mit
NuGet >= 2.5
) zu ermöglichen:Fügen Sie
build\<ProjectName>.targets
Ihrem zu verpackenden Projekt eine Datei hinzu (oder ändern Sie sie), und fügen Sie folgenden Inhalt ein (stellen Sie sicher, dass Sie ihn<AssemblyName>
durch einen tatsächlichen Wert ersetzen ):<?xml version="1.0" encoding="utf-8" ?> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <!-- for C++/CLI projects only --> <ItemGroup Condition="'$(Language)' == 'C++'"> <Reference Include="<AssemblyName>"> <!-- this .targets file is installed next to the assembly, so we do not have to figure out any versions or paths here ourselves --> <HintPath> $(MSBuildThisFileDirectory)..\lib\native\<AssemblyName>.dll </HintPath> </Reference> </ItemGroup> </Project>
In den
.nuspec
von den verpackten Projekt auch einer oder mehrfile
Einträgen auch die Montag in platzierenlib\native\
Verzeichnis auf dem Zielcomputer:<package> <metadata> ... </metadata> <files> ... <!-- add a copy of the assembly to lib\native to prevent NuGet from complaining about incompatible native projects --> <file src="bin\$configuration$\$id$.dll" target="lib\native\" /> <file src="bin\$configuration$\$id$.xml" target="lib\native\" /> <!-- don't forget about the .targets file containing the reference --> <file src="build\$id$.targets" target="build\" /> </files> ... </package>
Auch wenn NuGet nicht hinzufügen Montag Verweise auf C ++ / CLI - Projekte, fügt sie noch jeden
.props
und.targets
von einem Paket bereitgestellt Dateien. Das benutzerdefinierte Ziel aus Schritt 1 fügt einen Verweis auf unsere verpackte Baugruppe hinzu.Ein Nachteil dieser Lösung ist meines Erachtens , dass die so hinzugefügte Referenz nicht im
Commpon Properties/Framework and References
Abschnitt des C ++ / CLI-Projekts angezeigt wird . Es kann auch andere geben, verwenden Sie es also auf eigenes Risiko ...quelle
Wie in der Antwort auf diesen Port erwähnt ( Nuget installiert Entity Framework nicht in einem C ++ / CLI-Projekt ), nimmt NuGet die Änderungen an einem C ++ / CLI-Projekt nicht für Sie vor. Es wird jedoch die Abhängigkeit für Sie herunterladen und entpacken. Wir verwenden es über die Befehlszeile als Teil unserer Make-Abhängigkeiten. Die Befehlszeile sieht ungefähr so aus:
Beachten Sie, dass die Befehlszeilenelemente eins zu einer Zeile getrennt sind, um das Lesen zu erleichtern. Außerdem haben wir uns entschlossen, NuGet in unsere Quellcodeverwaltung im Ordner .NuGet einzuchecken. Ziel war es, die Einrichtung einer Build-Maschine für unsere verschiedenen Umgebungen (von denen nicht alle Visual Studio verwenden) zu vereinfachen. Nachdem Sie diesen Befehl zum ersten Mal ausgeführt haben, müssen Sie die Abhängigkeiten manuell zu Ihrem C ++ / CLI-Projekt hinzufügen.
Hoffentlich hilft das.
quelle
Das Installationsprogramm versucht, im C # -Startprojekt einen Verweis auf sich selbst hinzuzufügen. Machen Sie vor der Installation ein C # -Projekt zum Startprojekt in der Lösung. Erstellen Sie ein Dummy-C # -Projekt, falls Sie keines haben
quelle
Eine einfache Problemumgehung besteht darin, ein solches NuGet in ein reguläres .NET-Projekt (C #) zu verpacken und in Ihrem C ++ / CLI-Projekt darauf zu verweisen.
quelle
Die obigen Antworten haben Probleme mit Abhängigkeiten der zweiten Ebene (zumindest in meinem Fall unter Visual Studio 2019).
Um das Problem zu lösen, erstelle ich normalerweise eine leere c # -Konsolenanwendung und verweise dort auf alle Pakete.
Dann verwende ich dieses Post-Build-Snippet, um alles außer den Hauptartefakten des Projekts in einen gemeinsamen Speicher zu kopieren, der
packages
im Lösungsordner benannt ist.<Target Name="PostBuild" AfterTargets="PostBuildEvent"> <PropertyGroup> <SharedLibraries>$(SolutionDir)\packages</SharedLibraries> </PropertyGroup> <ItemGroup> <Artifacts Include="$(OutDir)\**" /> </ItemGroup> <RemoveDir Condition=" Exists('$(SharedLibraries)')" Directories="$(SharedLibraries)" /> <MakeDir Condition=" !Exists('$(SharedLibraries)')" Directories="$(SharedLibraries)" /> <Copy SourceFiles="@(Artifacts)" DestinationFolder="$(SharedLibraries)\%(RecursiveDir)" /> <ItemGroup> <ExtraFiles Include="$(SharedLibraries)\$(ProjectName).*"></ExtraFiles> </ItemGroup> <Delete Files="@(ExtraFiles)" /> </Target>
Der gesamte
packages
Ordner wird dann mit einer benutzerdefinierten Aufgabe im c ++ / cli-Projekt bereitgestellt.Diese Lösung ist geeignet, wenn die Pakete, auf die verwiesen wird, auf etwas abzielen.
AnyCPU
Andernfalls ist etwas Basteln erforderlich, um unterschiedliche Ordner für jede Prozessorarchitektur zu verwenden, und funktioniert wahrscheinlich nicht.Diese Lösung ist nicht elegant, löst jedoch den Zweck, Nuget-Pakete (indirekt) aus einem c ++ / cli-Projekt zuverlässig zu konsumieren.
Das Plus dieser Lösung gegenüber anderen hier veröffentlichten ist, dass die Pfade nicht versioniert sind, sodass C ++ / Cli-Projekte während des normalen Paket-Upgrades niemals geändert werden.
quelle
Anmeldeinformationen werden tatsächlich mit dem Maschinenschlüssel verschlüsselt, auf dem die Paketquelle hinzugefügt wurde. Sofern nicht die Klartextvariante verwendet wird, sollte der Befehl setApiKey wahrscheinlich als Teil des Builds ausgeführt werden.
quelle