Lernprogramm: Installieren systemeigener Abhängigkeiten in einer CLR-Anwendung
C++/CLI ist eine Technologie, mit der Sie .NET-Klassen mit systemeigenen C++-Typen kombinieren können, um Bibliotheken und Anwendungen zu erstellen, die C++-Code verwenden und für .NET-Programme zugänglich machen.
Sie können vcpkg in Kombination mit C++/CLI verwenden, um C++-Abhängigkeiten in Ihren Projekten zu installieren und zu nutzen, die auf die Common Language Runtime (CLR) abzielen.
In diesem Tutorial lernen Sie Folgendes:
- vcpkg
- Git
- Developer Powershell für Visual Studio
- Visual Studio mit den folgenden Komponenten:
In diesem Lernprogramm beginnen wir mit einer vorhandenen C++/CLI-Anwendung und fügen eine mit vcpkg installierte C++-Abhängigkeit hinzu. Bei den Befehlen in diesem Lernprogramm wird davon ausgegangen, dass Sie sie in einer Entwickler-PowerShell für Visual Studio ausführen.
1. Klonen des Beispielrepositorys
Der erste Schritt besteht darin, eine Kopie der C++/CLI-Beispielanwendung im .NET-Beispiel-Repository abzurufen. Die C++/CLI-Beispielanwendung befindet sich im core/interop/cpp-cli
Ordner.
git clone https://github.com/dotnet/samples
2 – Navigieren zum Beispielanwendungsordner
cd samples/core/interpo/cpp-cli
2 – Überprüfen, ob das Projekt ordnungsgemäß erstellt und ausgeführt wird
Das Beispiel-Repository enthält eine Lösung mit vier Projekten:
- ManagedLibrary: Eine C#-Bibliothek für .NET
- MixedLibrary: Eine Bibliothek, die systemeigenen C++-Code und .NET-Code aus ManagedLibrary mischt
- NativeApp: Eine C++-Anwendung, die .NET-Code aus MixedLibrary verwendet
- ManagedApp: Eine C#-Anwendung, die C++-Code aus MixedLibrary verwendet
Führen Sie den folgenden Befehl aus, um die Projekte der Lösung zu erstellen:
msbuild CPP-CLI.sln -restore
Wenn der Build fehlschlägt, stellen Sie sicher, dass Sie die erforderlichen Komponenten für Visual Studio installiert haben, die im Abschnitt "Voraussetzungen" aufgeführt sind und dass Sie die Mindestanforderungen des .NET 5.0 SDK oder höher und Visual Studio 2019 16.8 oder höher] der Beispielanwendung erfüllen.
Nach der Erstellung können Sie ausführen ManagedApp.exe
./bin/Debug/x64/ManagedApp.exe
Das Programm erzeugt die folgende Ausgabe:
=== Managed class ===
Hello from ManagedClass in MixedLibrary
Hello from NativeClass in MixedLibrary
-- message: from managed app!
=== P/Invoke ===
Hello from NativeEntryPoint_CallNative in MixedLibrary
Hello from NativeClass in MixedLibrary
-- message: from managed app!
3 – Öffnen des Projekts in Visual Studio
In den nächsten Schritten ändern wir die Bibliothek so, dass fmt
Nachrichten in der Konsole gedruckt werden. Die fmt
Bibliothek wird über vcpkg installiert und in den verbrauchenden Projekten verknüpft.
Um die Quelldateien zu bearbeiten, öffnen Sie die CPP-CLI.sln Projektmappe in Visual Studio:
start CPP-CLI.sln
Nachdem die Projektmappe in Visual Studio geöffnet wurde, erhalten Sie möglicherweise eine Eingabeaufforderung, um das Projekt auf die neuesten Versionen neu zuzuweisen. Sie können auf "OK" klicken, um das Windows SDK-Versions- und Plattformtoolset auf die neuesten Versionen zu aktualisieren.
Die Windows SDK-Version und die Plattformtoolset-Zielversion des Projekts auf die neueste Version.
Als Nächstes nehmen wir die folgenden Änderungen am MixedLibrary-Projekt vor.
- Fügen Sie ein vcpkg-Manifest zum Abrufen
fmt
hinzu. - Aktivieren Sie vcpkg im Projekt.
- Ändern Sie die
NativeClass::Hello
Zum Drucken von Nachrichten zu verwendendefmt
Option.
1 – Erstellen eines vcpkg-Manifests
Klicken Sie mit der rechten Maustaste auf das NativeLibrary-Projekt, und klicken Sie im Kontextmenü auf "Neues Element hinzufügen > ".
Benennen Sie das neue Element vcpkg.json
, dies ist die vcpkg-Manifestdatei, und stellen Sie sicher, dass die Datei im Stammverzeichnis des Ordners des Projekts erstellt wird.
2 – Als Depedency hinzufügen fmt
Öffnen Sie die vcpkg.json
Datei, und bearbeiten Sie deren Inhalt, um folgendes zu entsprechen:
{
"dependencies": [ "fmt" ]
}
Wenn sich die vcpkg-Manifestdatei am richtigen Speicherort befindet und Sie versuchen, das Projekt zu erstellen, erhalten Sie die folgende Warnung:
The vcpkg manifest was disabled, but we found a manifest file in samples\core\interop\cpp-cli\MixedLibrary\. You may want to enable vcpkg manifests in your properties page or pass /p:VcpkgEnableManifest=true to the msbuild invocation.
3 – Aktivieren von vcpkg in MixedLibrary-Eigenschaften
Öffnen Sie die Eigenschaftenseite von MixedLibrary, indem Sie mit der rechten Maustaste auf das Projekt klicken und auf die Option "Eigenschaften" klicken.
Ändern Sie die folgenden Eigenschaften im Abschnitt "vcpkg":
- Verwenden von "Vcpkg " auf "Ja"
- Verwenden des Vcpkg-Manifests auf "Ja" festgelegt
- Instal-Vcpkg-Abhängigkeiten auf "Ja" festgelegt
- AutoLink auf "Ja" festlegen
- App-lokale Bereitstellung von DLLs auf "Ja" festgelegt
erforderlich, um vcpkg zu aktivieren
Mit diesen Änderungen liest Visual Studio nun die vcpkg.json
Datei und installiert die Abhängigkeiten, die im Manifest enthalten sind, vor dem Erstellen des Projekts automatisch.
Auf der Seite "Eigenschaften" möchten wir auch das /utf-8
Flag aktivieren, um den Build ordnungsgemäß zu erstellen fmt
.
Bearbeiten Sie in der Befehlszeilenunterabschnitt der C/C++-Einstellungen die zusätzlichen Optionen, die in den Eintrag aufgenommen /utf-8
werden sollen.
Klicken Sie abschließend auf "OK", um die Seite "Eigenschaften" zu schließen.
4 – Überprüfen, ob vcpkg funktioniert
Wenn alles ordnungsgemäß konfiguriert ist, ruft Visual Studio vcpkg auf, um Ihre Abhängigkeiten zu installieren, bevor Sie das MixedLibrary-Projekt erstellen.
1>Installing vcpkg dependencies to C:\path\to\samples\core\interop\cpp-cli\MixedLibrary\vcpkg_installed\x64-windows\
1>"C:\path\to\vcpkg\vcpkg.exe" install --x-wait-for-lock --triplet "x64-windows" --vcpkg-root "C:\path\to\vcpkg\" "--x-manifest-root=C:\path\to\samples\core\interop\cpp-cli\MixedLibrary\" "--x-install-root=C:\path\to\samples\core\interop\cpp-cli\MixedLibrary\vcpkg_installed\x64-windows\"
Wenn die vcpkg-Ausgabe nicht angezeigt wird oder fmt
die Erstellung fehlschlägt, stellen Sie sicher, dass Sie die oben genannten Schritte ordnungsgemäß ausgeführt haben, einschließlich des Hinzufügens /utf-8
in der Befehlszeile "Zusätzliche Optionen" in C/C++ > .
4 – Ändern des Quellcodes des Projekts
Schließlich möchten wir die MixedLibrary.cpp
Datei so ändern, dass fmt
Nachrichten in der Konsole gedruckt werden. Nehmen Sie die folgenden Änderungen am Quellcode vor:
1 – Fügen Sie die fmt/printf.h
Kopfzeile (in Zeile 5) ein.
#include <iostream>
#include <vcclr.h>
#include <fmt/printf.h>
2 – Ändern Sie die NativeClass::Hello
zu verwendende fmt::println
Funktion (in Zeile 44).
void MixedLibrary::NativeClass::Hello(const wchar_t *msg)
{
auto ws = std::wstring(msg);
auto str = std::string(ws.length(), 0);
std::transform(ws.begin(), ws.end(), std::back_inserter(str), [](wchar_t c) { return static_cast<char>(c); });
fmt::println("Hello from NativeClass in MixedLibrary");
fmt::println("-- message: {}", str);
fmt::println("-- printed using FMT version {}", FMT_VERSION);
}
Die NativeClass::Hello
Funktion wird im ManagedApp-Projekt verwendet, um eine Nachricht mithilfe von C++-Code in der Konsole zu drucken. Die oben genannten Änderungen nehmen sie so vor, dass die fmt
Bibliothek in der CLR-Anwendung genutzt wird.
Es sind keine Changs für das Projekt der Anwendung erforderlich, erstellen Sie einfach das ManagedApp-Projekt, und führen Sie es aus.
Die Ausgabe des Programms sollte etwa wie folgt aussehen:
=== Managed class ===
Hello from ManagedClass in MixedLibrary
Hello from NativeClass in MixedLibrary
-- message: from managed app!
-- printed using FMT version 110002
=== P/Invoke ===
Hello from NativeEntryPoint_CallNative in MixedLibrary
Hello from NativeClass in MixedLibrary
-- message: from managed app!
-- printed using FMT version 110002
Erfahren Sie auch mehr über andere nützliche Features:
Feedback zu vcpkg
vcpkg ist ein Open Source-Projekt. Wählen Sie einen Link aus, um Feedback zu geben: