Zelfstudie: Systeemeigen afhankelijkheden installeren in een CLR-toepassing

C++/CLI is een technologie waarmee u .NET klassen kunt combineren met systeemeigen C++-typen om bibliotheken en toepassingen te maken die C++-code gebruiken en deze toegankelijk maken voor .NET programma's.

U kunt vcpkg gebruiken in combinatie met C++/CLI om C++ afhankelijkheden te installeren en te gebruiken in uw projecten die gericht zijn op Common Language Runtime (CLR).

In deze zelfstudie leert u het volgende:

Prerequisites

Een voorbeeld van een C++/CLI maken

In deze zelfstudie beginnen we met een bestaande C++/CLI-toepassing en voegen we een C++-afhankelijkheid toe die is geïnstalleerd met vcpkg. Bij de opdrachten in deze zelfstudie wordt ervan uitgegaan dat u ze uitvoert in een Developer PowerShell voor Visual Studio.

1 - Kloon de voorbeeldopslagplaats

De eerste stap is het ophalen van een kopie van de C++/CLI-voorbeeldtoepassing in de opslagplaats met .NET voorbeelden. De C++/CLI-voorbeeldtoepassing bevindt zich in de core/interop/cpp-cli map.

git clone https://github.com/dotnet/samples

2 - Navigeer naar de voorbeeldtoepassingsmap

cd samples/core/interpo/cpp-cli

2 - Controleer of het project correct wordt gebouwd en uitgevoerd

De voorbeeldopslagplaats bevat een oplossing met vier projecten:

  • ManagedLibrary: een C#-bibliotheek voor .NET
  • MixedLibrary: Een bibliotheek die systeemeigen C++-code combineert en .NET code uit ManagedLibrary
  • NativeApp: een C++-toepassing die .NET code van MixedLibrary verbruikt
  • ManagedApp: een C#-toepassing die C++-code uit MixedLibrary verbruikt

Voer de volgende opdracht uit om de projecten van de oplossing te bouwen:

msbuild CPP-CLI.sln -restore

Als de build mislukt, moet u ervoor zorgen dat u de vereiste onderdelen hebt geïnstalleerd voor Visual Studio vermeld in de sectie Vereisten en dat u voldoet aan de minimale vereisten van .NET 5.0 SDK of hoger en Visual Studio 2019 16.8 of hoger van de voorbeeldtoepassing.

Zodra dit is gebouwd, kunt u ManagedApp.exe uitvoeren

./bin/Debug/x64/ManagedApp.exe

Het programma produceert de volgende uitvoer:

=== 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 - Open het project in Visual Studio

In de volgende stappen wijzigen we de bibliotheek zodat deze fmt gebruikt om berichten in de console af te drukken. De fmt bibliotheek wordt geïnstalleerd via vcpkg en gekoppeld in de verbruikende projecten.

Als u de bronbestanden wilt bewerken, opent u de CPP-CLI.sln oplossing in Visual Studio:

start CPP-CLI.sln

Zodra de oplossing in Visual Studio is geopend, kunt u mogelijk een melding krijgen om het project opnieuw te richten op de nieuwste versies. U kunt op OK klikken om de Windows SDK-versie en platformhulpprogrammaset te upgraden naar de nieuwste versie.

Bestaand project opnieuw toewijzen

Werk de Windows SDK-doelversie van het project en de versie van de platformtoolset bij naar de nieuwste versie.

Een systeemeigen C++-afhankelijkheid toevoegen

Vervolgens brengen we de volgende wijzigingen aan in het MixedLibrary-project.

  • Voeg een vcpkg-manifest toe om te verkrijgen fmt.
  • Schakel vcpkg in het project in.
  • Wijzig NativeClass::Hello zodat fmt wordt gebruikt om berichten weer te geven.

1 - Een vcpkg-manifest maken

Klik met de rechtermuisknop op het NativeLibrary-project en klik op Nieuw item toevoegen > in het contextmenu.

Geef het nieuwe item vcpkg.jsoneen naam, dit is het vcpkg-manifestbestand en zorg ervoor dat het bestand is gemaakt in de hoofdmap van de map van het project.

2 - Voeg fmt toe als afhankelijkheid

Open het vcpkg.json bestand en bewerk de inhoud zodat deze overeenkomt met het volgende:

{
  "dependencies": [ "fmt" ]
}

Als het vcpkg-manifestbestand zich op de juiste locatie bevindt en u probeert het project te bouwen, krijgt u de volgende waarschuwing:

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 - Vcpkg inschakelen in de eigenschappen van MixedLibrary

Open de eigenschappenpagina van MixedLibrary door met de rechtermuisknop op het project te klikken en op de optie Eigenschappen te klikken.

Wijzig de volgende eigenschappen in de sectie vcpkg:

  • Gebruik Vcpkg ingesteld op Ja
  • Vcpkg-manifest gebruiken ingesteld op Ja
  • Instal Vcpkg-afhankelijkheden ingesteld op Ja
  • AutoLink gebruiken ingesteld op Ja
  • DLL's lokaal in de app implementeren ingesteld op Ja

Eigenschappen van MixedLibrary-project

vereist om vcpkg in te schakelen

Met deze wijzigingen leest Visual Studio het vcpkg.json bestand nu en installeert u de afhankelijkheden in het manifest automatisch voordat u het project bouwt.

Op de pagina Eigenschappen willen we ook de markering /utf-8 inschakelen, zodat fmt correct wordt gecompileerd.

Bewerk in de subsectie Opdrachtregel van de instellingen voor C/C++ de Aanvullende opties om /utf-8 op te nemen in de

Klik ten slotte op OK om de pagina Eigenschappen te sluiten.

4 - Controleren of vcpkg werkt

Als alles correct is geconfigureerd, roept Visual Studio vcpkg aan om uw afhankelijkheden te installeren voordat u het MixedLibrary-project bouwt.

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\"

Als u geen uitvoer van vcpkg ziet, of als het bouwen van fmt mislukt, controleer dan of u de bovenstaande stappen correct hebt gevolgd, inclusief het toevoegen van /utf-8 aan Extra opties in de opdrachtregel onder C/C++ >.

4 - De broncode van het project wijzigen

Ten slotte willen we het bestand MixedLibrary.cpp wijzigen om fmt te gebruiken om berichten op de console weer te geven. Breng de volgende wijzigingen aan in de broncode:

1 - Neem de fmt/printf.h koptekst (op regel 5) op.

#include <iostream>
#include <vcclr.h>
#include <fmt/printf.h>

2 - Wijzig de NativeClass::Hello-functie zodat deze fmt::println gebruikt (op regel 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);
}

De toepassing bouwen

De NativeClass::Hello functie wordt gebruikt in het ManagedApp-project om een bericht naar de console af te drukken met behulp van C++-code. De bovenstaande wijzigingen zorgen ervoor dat de fmt bibliotheek wordt gebruikt in de CLR-toepassing.

Er zijn geen wijzigingen nodig aan het project van de toepassing; u hoeft alleen het ManagedApp-project te bouwen en uit te voeren.

De uitvoer van het programma moet er ongeveer als volgt uitzien:

=== 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

Volgende stappen 

Meer informatie over andere nuttige functies: