Číst v angličtině

Sdílet prostřednictvím


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:

Požadavky

Vytvoření ukázkového C++/CLI

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.

Změna cílení existujícího projektu

Cílová verze sady Windows SDK a sady nástrojů platformy projektu na nejnovější verzi.

Přidání nativní závislosti jazyka C++

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žít fmt 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

Vlastnosti projektu MixedLibrary

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

Sestavení aplikace

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

Další kroky

Seznamte se také s dalšími užitečnými funkcemi: