Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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
- vcpkg
- Git
- Utvecklar-PowerShell för Visual Studio
- Visual Studio med följande komponenter:
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.
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::Helloså att den använderfmtfö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
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: