Självstudie: Installera interna beroenden i ett CLR-program

C++/CLI är en teknik som gör att du kan kombinera .NET klasser med interna C++-typer för att skapa bibliotek och program som använder C++-kod och gör den tillgänglig för .NET program.

Du kan använda vcpkg i kombination med C++/CLI för att installera och använda C++-beroenden i dina projekt som är inriktade på CLR (Common Language Runtime).

I den här handledningen får du lära dig att:

Förutsättningar

Skapa ett exempel på C++/CLI

I den här självstudien börjar vi från ett befintligt C++/CLI-program och lägger till ett C++-beroende installerat med vcpkg. Kommandona i den här självstudien förutsätter att du kör dem i en Developer PowerShell för Visual Studio.

1 – Klona exempellagringsplatsen

Det första steget är att hämta en kopia av C++/CLI-exempelprogrammet på lagringsplatsen .NET exempel. C++/CLI-exempelprogrammet finns i core/interop/cpp-cli mappen .

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

2 – Navigera till mappen för exempelprogrammet

cd samples/core/interpo/cpp-cli

2 – Kontrollera att projektet bygger och körs korrekt

Exempellagringsplatsen innehåller en lösning med fyra projekt:

  • ManagedLibrary: Ett C#-bibliotek för .NET
  • MixedLibrary: Ett bibliotek som blandar intern C++-kod och .NET kod från ManagedLibrary
  • NativeApp: Ett C++-program som använder .NET kod från MixedLibrary
  • ManagedApp: Ett C#-program som använder C++-kod från MixedLibrary

Kör följande kommando för att skapa lösningens projekt:

msbuild CPP-CLI.sln -restore

Om bygget misslyckas kontrollerar du att du har installerat nödvändiga komponenter för Visual Studio som anges i avsnittet Förutsättningar och att du uppfyller minimikraven för .NET 5.0 SDK eller senare och Visual Studio 2019 16.8 eller senare av exempelprogrammet.

När du har skapat den kan du köra ManagedApp.exe

./bin/Debug/x64/ManagedApp.exe

Programmet genererar följande utdata:

=== 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 – Öppna projektet i Visual Studio

I nästa steg ändrar vi biblioteket som ska användas fmt för att skriva ut meddelanden till konsolen. Biblioteket fmt installeras via vcpkg och länkas i de förbrukande projekten.

Om du vill redigera källfilerna öppnar du den CPP-CLI.sln lösningen i Visual Studio:

start CPP-CLI.sln

När lösningen har öppnats i Visual Studio kan du få en uppmaning om att omdirigera projektet till de senaste versionerna. Du kan klicka på OK för att uppgradera Windows SDK-version och plattformsverktyg till den senaste.

Ommåla befintligt projekt

projektets Windows SDK-målversion och version av plattformsverktygen till den senaste versionen.

Lägga till ett inbyggt C++-beroende

Därefter kommer vi att göra följande ändringar i MixedLibrary-projektet.

  • Lägg till ett vcpkg-manifest för att hämta fmt.
  • Aktivera vcpkg i projektet.
  • Ändra NativeClass::Hello så att den använder fmt för att skriva ut meddelanden.

1 – Skapa ett vcpkg-manifest

Högerklicka på projektet NativeLibrary och klicka på Lägg till > nytt objekt på snabbmenyn.

Ge det nya objektet vcpkg.jsonnamnet , det här är vcpkg-manifestfilen och kontrollera att filen har skapats i roten i projektets mapp.

2 - Lägg till fmt som ett beroende

vcpkg.json Öppna filen och redigera dess innehåll så att det matchar följande:

{
  "dependencies": [ "fmt" ]
}

Om vcpkg-manifestfilen finns på rätt plats och du försöker skapa projektet får du följande varning:

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 – Aktivera vcpkg i MixedLibrarys egenskaper

Öppna egenskapssidan för MixedLibrary genom att högerklicka på projektet och klicka på alternativet Egenskaper.

Ändra följande egenskaper i avsnittet vcpkg:

  • Använd Vcpkg inställt på Ja
  • Använd Vcpkg Manifest inställt på Ja
  • Instal Vcpkg-beroenden inställda på Ja
  • Använd autolänk inställd på Ja
  • Distribuera DLL-filer lokalt för appen inställd på Ja

MixedLibrary-projektegenskaper

krävs för att aktivera vcpkg

Med dessa ändringar kommer Visual Studio nu att läsa vcpkg.json filen och automatiskt installera de beroenden som finns i manifestet innan projektet skapas.

På sidan Egenskaper vill vi också aktivera flaggan /utf-8 så att fmt byggs korrekt.

I avsnittet Kommandorad i C/C++-inställningarna redigerar du Ytterligare alternativ så att /utf-8 inkluderas i the

Klicka slutligen på OK för att stänga sidan Egenskaper.

4 – Kontrollera att vcpkg fungerar

Om allt är korrekt konfigurerat anropar Visual Studio vcpkg för att installera dina beroenden innan du skapar MixedLibrary-projektet.

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

Om du inte ser utdata från vcpkg, eller om det inte går att kompilera fmt, kontrollera att du har följt stegen ovan korrekt, inklusive att lägga till /utf-8 i Ytterligare alternativ under Kommandorad i C/C++ >.

4 – Ändra projektets källkod

Slutligen vill vi ändra filen MixedLibrary.cpp så att den använder fmt för att skriva ut meddelanden i konsolen. Gör följande ändringar i källkoden:

1 – Inkludera fmt/printf.h rubriken (på rad 5).

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

2 – Ändra funktionen NativeClass::Hello så att den använder fmt::println (på rad 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);
}

Skapa programmet

Funktionen NativeClass::Hello används i ManagedApp-projektet för att skriva ut ett meddelande till konsolen med hjälp av C++-kod. Ändringarna ovan gör det så att fmt biblioteket används i CLR-programmet.

Inga ändringar i applikationens projekt behövs, det räcker att kompilera och köra ManagedApp-projektet.

Programmets utdata bör se ut ungefär så här:

=== 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ästa steg

Läs även om andra användbara funktioner: