Samouczek: instalowanie zależności natywnych w aplikacji CLR
Artykuł
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.
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:
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.
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
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.
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:
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:
Źródło tej zawartości można znaleźć w witrynie GitHub, gdzie można również tworzyć i przeglądać problemy i żądania ściągnięcia. Więcej informacji znajdziesz w naszym przewodniku dla współtwórców.
Opinia o produkcie vcpkg
vcpkg to projekt typu open source. Wybierz link, aby przekazać opinię:
Utwórz projekt platformy .NET i dowiedz się, jak dodawać pakiety i zarządzać zależnościami pakietów w projekcie. Użyj interfejsu wiersza polecenia platformy .NET Core i rejestru NuGet, aby dodać biblioteki i narzędzia do aplikacji w języku C# przy użyciu programu Visual Studio Code.