Kurz: Instalace nativních závislostí v aplikaci CLR
C++/CLI je technologie, která umožňuje kombinovat třídy .NET s nativními typy jazyka C++ a vytvářet knihovny a aplikace, které přebírají kód jazyka C++ a umožňují přístup k programům .NET.
Vcpkg můžete v kombinaci s C++/CLI použít k instalaci a využívání závislostí C++ ve vašich projektech, které cílí na modul CLR (Common Language Runtime).
V tomto kurzu se naučíte, jak:
- vcpkg
- Git
- Developer PowerShell pro Visual Studio
- Visual Studio s následujícími komponentami:
V tomto kurzu začneme z existující aplikace C++/CLI a přidáme závislé prostředí C++ nainstalované s vcpkg. Příkazy v tomto kurzu předpokládají, že je spouštíte v prostředí Developer PowerShell pro Visual Studio.
1. Klonování ukázkového úložiště
Prvním krokem je získání kopie ukázkové aplikace C++/CLI v úložišti ukázek .NET. Ukázková aplikace C++/CLI se nachází ve core/interop/cpp-cli
složce.
git clone https://github.com/dotnet/samples
2. Přejděte do složky ukázkové aplikace.
cd samples/core/interpo/cpp-cli
2 . Zkontrolujte, jestli se projekt sestaví a spustí správně.
Ukázkové úložiště obsahuje řešení se čtyřmi projekty:
- ManagedLibrary: Knihovna jazyka C# pro .NET
- MixedLibrary: Knihovna, která kombinuje nativní kód C++ a kód .NET z ManagedLibrary
- NativeApp: Aplikace C++, která využívá kód .NET z mixedLibrary
- ManagedApp: Aplikace jazyka C#, která využívá kód jazyka C++ z mixedLibrary
Spuštěním následujícího příkazu sestavte projekty řešení:
msbuild CPP-CLI.sln -restore
Pokud sestavení selže, ujistěte se, že jste nainstalovali požadované součásti pro Visual Studio uvedené v části Požadavky a že splňujete minimální požadavky sady .NET 5.0 SDK nebo novější a Visual Studio 2019 16.8 nebo novější] ukázkové aplikace.
Po sestavení můžete spustit ManagedApp.exe
./bin/Debug/x64/ManagedApp.exe
Program vytvoří následující výstup:
=== 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. Otevření projektu v sadě Visual Studio
V dalších krocích upravíme knihovnu tak, aby používala fmt
k tisku zpráv do konzoly. Knihovna fmt
se nainstaluje prostřednictvím vcpkg a propojila se v náročných projektech.
Pokud chcete upravit zdrojové soubory, otevřete řešení CPP-CLI.sln v sadě Visual Studio:
start CPP-CLI.sln
Po otevření řešení v sadě Visual Studio se může zobrazit výzva k opětovnému cílení projektu na nejnovější verze. Kliknutím na tlačítko OK můžete upgradovat sadu nástrojů sady Windows SDK na nejnovější verzi.
Cílová verze sady Windows SDK a sady nástrojů platformy projektu na nejnovější verzi.
Dále provedeme následující změny projektu MixedLibrary.
- Přidejte manifest vcpkg k získání
fmt
. - Povolte v projektu vcpkg.
NativeClass::Hello
Upravte možnost použítfmt
k tisku zpráv.
1. Vytvoření manifestu vcpkg
Klikněte pravým tlačítkem myši na projekt NativeLibrary a v místní nabídce klikněte na Přidat > novou položku.
Pojmenujte novou položku vcpkg.json
, jedná se o soubor manifestu vcpkg a ujistěte se, že je soubor vytvořen v kořenové složce projektu.
2. Přidání fmt
jako zastaralosti
vcpkg.json
Otevřete soubor a upravte jeho obsah tak, aby odpovídal následujícímu:
{
"dependencies": [ "fmt" ]
}
Pokud se soubor manifestu vcpkg nachází ve správném umístění a pokusíte se sestavit projekt, zobrazí se následující upozornění:
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 . Povolení vcpkg ve vlastnostech mixedLibrary
Otevřete stránku vlastností mixedLibrary tak, že kliknete pravým tlačítkem myši na projekt a kliknete na možnost Vlastnosti.
V části vcpkg změňte následující vlastnosti:
- Použití Vcpkg nastaveno na Ano
- Použití manifestu Vcpkg nastaveno na Ano
- Instalovat závislosti Vcpkg nastavené na Ano
- Použít automatické propojení nastaveno na Ano
- Místní nasazení knihoven DLL aplikací nastavených na Ano
vyžadováno pro povolení vcpkg
Díky těmto změnám sada Visual Studio teď před sestavením projektu přečte vcpkg.json
soubor a automatcally nainstaluje závislosti obsažené v manifestu.
Na stránce Vlastnosti chceme také povolit správné sestavení příznakem /utf-8
fmt
.
V pododdílu Příkazového řádku nastavení C/C++ upravte další možnosti, které chcete zahrnout /utf-8
do
Nakonec kliknutím na tlačítko OK zavřete stránku Vlastnosti.
4. Ověření, že vcpkg funguje
Pokud je vše správně nakonfigurované, Visual Studio vyvolá vcpkg k instalaci závislostí před sestavením projektu MixedLibrary.
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\"
Pokud se nezobrazuje výstup vcpkg nebo pokud fmt
se nepodaří sestavit, ujistěte se, že jste postupovali podle výše uvedených kroků, včetně přidání /utf-8
do dalších možností v příkazovém řádku C/C++ > .
4. Úprava zdrojového kódu projektu
Nakonec chceme soubor upravit MixedLibrary.cpp
tak, aby se vytiskly fmt
zprávy do konzoly. Proveďte následující změny zdrojového kódu:
1 – Zahrňte fmt/printf.h
záhlaví (na řádku 5).
#include <iostream>
#include <vcclr.h>
#include <fmt/printf.h>
2 – Upravte NativeClass::Hello
funkci tak, aby používala fmt::println
(na řádku 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);
}
Funkce NativeClass::Hello
se používá v projektu ManagedApp k tisku zprávy do konzoly pomocí kódu C++. Výše uvedené změny provede tak, aby fmt
knihovna byla spotřebována v aplikaci CLR.
Nejsou potřeba žádné změny projektu aplikace, stačí sestavit a spustit projekt ManagedApp.
Výstup programu by měl vypadat nějak takto:
=== 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
Seznamte se také s dalšími užitečnými funkcemi:
Zpětná vazba k produktu vcpkg
vcpkg je open source projekt. Vyberte odkaz pro poskytnutí zpětné vazby: