Auf Englisch lesen

Freigeben über


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:

Voraussetzungen

Erstellen eines Beispiels für C++/CLI

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.

Vorhandenes Projekt retargetieren

Die Windows SDK-Version und die Plattformtoolset-Zielversion des Projekts auf die neueste Version.

Hinzufügen einer systemeigenen C++-Abhängigkeit

Als Nächstes nehmen wir die folgenden Änderungen am MixedLibrary-Projekt vor.

  • Fügen Sie ein vcpkg-Manifest zum Abrufen fmthinzu.
  • Aktivieren Sie vcpkg im Projekt.
  • Ändern Sie die NativeClass::Hello Zum Drucken von Nachrichten zu verwendende fmt 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

MixedLibrary-Projekteigenschaften

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);
}

Erstellen der Anwendung

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

Nächste Schritte

Erfahren Sie auch mehr über andere nützliche Features: