Przeczytaj w języku angielskim

Udostępnij za pośrednictwem


Samouczek: instalowanie zależności natywnych w aplikacji CLR

C++/CLI to technologia umożliwiająca łączenie klas platformy .NET z natywnymi typami języka C++, aby tworzyć biblioteki i aplikacje, które przyjmują kod C++ i umożliwiają dostęp do programów .NET.

Narzędzie vcpkg można używać w połączeniu z językiem C++/CLI do instalowania i używania zależności języka C++ w projektach przeznaczonych dla środowiska uruchomieniowego języka wspólnego (CLR).

Niniejszy samouczek zawiera informacje na temat wykonywania następujących czynności:

Wymagania wstępne

Tworzenie przykładowego języka C++/interfejsu wiersza polecenia

W tym samouczku zaczniemy od istniejącej aplikacji C++/CLI i dodamy zależność języka C++ zainstalowaną z narzędziem vcpkg. W poleceniach w tym samouczku założono, że uruchamiasz je w programie PowerShell dla deweloperów dla programu Visual Studio.

1 — Klonowanie przykładowego repozytorium

Pierwszym krokiem jest pobranie kopii przykładowej aplikacji C++/CLI w repozytorium przykładów platformy .NET. Przykładowa aplikacja C++/CLI znajduje się w folderze core/interop/cpp-cli .

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

2 — Przejdź do folderu przykładowej aplikacji

cd samples/core/interpo/cpp-cli

2 — Sprawdź, czy projekt kompiluje i działa prawidłowo

Przykładowe repozytorium zawiera rozwiązanie z czterema projektami:

  • ManagedLibrary: biblioteka języka C# dla platformy .NET
  • MixedLibrary: biblioteka mieszająca natywny kod C++ i kod platformy .NET z biblioteki ManagedLibrary
  • NativeApp: aplikacja C++, która korzysta z kodu platformy .NET z biblioteki MixedLibrary
  • ManagedApp: aplikacja w języku C#, która korzysta z kodu C++ z biblioteki MixedLibrary

Uruchom następujące polecenie, aby skompilować projekty rozwiązania:

msbuild CPP-CLI.sln -restore

Jeśli kompilacja nie powiedzie się, upewnij się, że zainstalowano wymagane składniki programu Visual Studio wymienione w sekcji Wymagania wstępne i że spełniasz minimalne wymagania dotyczące zestawu .NET 5.0 SDK lub nowszego oraz programu Visual Studio 2019 16.8 lub nowszego] przykładowej aplikacji.

Po utworzeniu można uruchomić polecenie ManagedApp.exe

./bin/Debug/x64/ManagedApp.exe

Program generuje następujące dane wyjściowe:

=== 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 — Otwieranie projektu w programie Visual Studio

W następnych krokach zmodyfikujemy bibliotekę tak, aby wyświetlała fmt komunikaty w konsoli programu . Biblioteka fmt zostanie zainstalowana za pośrednictwem narzędzia vcpkg i zostanie połączona w projektach zużywających.

Aby edytować pliki źródłowe, otwórz rozwiązanie CPP-CLI.sln w programie Visual Studio:

start CPP-CLI.sln

Po otwarciu rozwiązania w programie Visual Studio może zostać wyświetlony monit o ponowne pobranie projektu do najnowszych wersji. Możesz kliknąć przycisk OK, aby uaktualnić zestaw narzędzi zestawu SDK systemu Windows do najnowszej wersji.

Retarget existing project (Retarget existing project)

docelowa wersja zestawu SDK systemu Windows i zestaw narzędzi platformy dla projektu do najnowszej wersji.

Dodawanie zależności natywnej języka C++

Następnie wprowadzimy następujące zmiany w projekcie MixedLibrary.

  • Dodaj manifest vcpkg, aby uzyskać fmtelement .
  • Włącz narzędzie vcpkg w projekcie.
  • Zmodyfikuj element , NativeClass::Hello aby fmt drukować komunikaty.

1 — Tworzenie manifestu vcpkg

Kliknij prawym przyciskiem myszy projekt NativeLibrary i kliknij polecenie Dodaj > nowy element w menu kontekstowym.

Nadaj nowej nazwie nowy element vcpkg.json, jest to plik manifestu vcpkg i upewnij się, że plik został utworzony w katalogu głównym folderu projektu.

2 — Dodawanie fmt jako przestarzałe

Otwórz plik i zmodyfikuj vcpkg.json jego zawartość, aby odpowiadała następującej zawartości:

{
  "dependencies": [ "fmt" ]
}

Jeśli plik manifestu programu vcpkg znajduje się w odpowiedniej lokalizacji i spróbujesz skompilować projekt, zostanie wyświetlone następujące ostrzeżenie:

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 — Włączanie vcpkg we właściwościach biblioteki mieszanej

Otwórz stronę właściwości biblioteki mieszanej, klikając prawym przyciskiem myszy projekt i klikając opcję Właściwości.

Zmień następujące właściwości w sekcji vcpkg:

  • Użyj zestawu Vcpkg na wartość Tak
  • Użyj manifestu Vcpkg ustawionego na wartość Tak
  • Instal Vcpkg Dependencies ustawiono wartość Tak
  • Użyj ustawienia AutoLink na wartość Tak
  • Lokalnie wdrażaj biblioteki DLL w aplikacji na wartość Tak

Właściwości projektu MixedLibrary

wymagane do włączenia programu vcpkg

Dzięki tym zmianom program Visual Studio odczyta plik vcpkg.json i automatycznie zainstaluje zależności zawarte w manifeście przed utworzeniem projektu.

Na stronie Właściwości chcemy również włączyć flagę w celu fmt poprawnego utworzenia /utf-8 kompilacji.

W podsekcji Wiersza polecenia ustawień języka C/C++ edytuj opcje dodatkowe, aby uwzględnić /utf-8 je w

Na koniec kliknij przycisk OK, aby zamknąć stronę Właściwości.

4 — Sprawdź, czy narzędzie vcpkg działa

Jeśli wszystko jest poprawnie skonfigurowane, program Visual Studio wywoła narzędzie vcpkg w celu zainstalowania zależności przed utworzeniem 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\"

Jeśli nie widzisz danych wyjściowych narzędzia vcpkg lub jeśli fmt kompilacja nie powiedzie się, upewnij się, że powyższe kroki zostały wykonane poprawnie, w tym dodanie /utf-8 dodatkowych opcji w wierszu polecenia języka C/C++ > .

4 — Modyfikowanie kodu źródłowego projektu

Na koniec chcemy zmodyfikować plik tak MixedLibrary.cpp , aby był używany fmt do drukowania komunikatów w konsoli programu . Wprowadź następujące zmiany w kodzie źródłowym:

1 — dołącz fmt/printf.h nagłówek (w wierszu 5).

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

2 — Zmodyfikuj NativeClass::Hello funkcję do użycia fmt::println (w wierszu 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);
}

Kompilowanie aplikacji

Funkcja NativeClass::Hello jest używana w projekcie ManagedApp do drukowania komunikatu w konsoli przy użyciu kodu C++. Powyższe zmiany sprawiają, że fmt biblioteka jest zużywana w aplikacji CLR.

Nie są potrzebne żadne zmiany w projekcie aplikacji, wystarczy skompilować i uruchomić projekt ManagedApp.

Dane wyjściowe programu powinny wyglądać podobnie do następujących:

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

Następne kroki

Zapoznaj się również z innymi przydatnymi funkcjami: