Руководство. Установка собственных зависимостей в приложении CLR
C++/CLI — это технология, которая позволяет объединять классы .NET с собственными типами C++ для создания библиотек и приложений, которые принимают код C++ и делают его доступными для программ .NET.
Вы можете использовать vcpkg в сочетании с C++/CLI для установки и использования зависимостей C++ в проектах, предназначенных для среды CLR.
В этом учебнике рассматривается следующее.
Необходимые компоненты
- vcpkg
- Git
- PowerShell для разработчиков для Visual Studio
- Visual Studio со следующими компонентами:
Создание примера C++/CLI
В этом руководстве мы начнем с существующего приложения C++/CLI и добавим зависимость C++, установленную с vcpkg. Команды, приведенные в этом руководстве, предполагают, что они выполняются в PowerShell разработчика для Visual Studio.
1. Клонирование репозитория с примерами
Первым шагом является получение копии примера приложения C++/CLI в репозитории примеров .NET. Пример приложения C++/CLI находится в папке core/interop/cpp-cli
.
git clone https://github.com/dotnet/samples
2. Переход к папке примера приложения
cd samples/core/interpo/cpp-cli
2. Проверка правильности сборки и запуска проекта
Пример репозитория содержит решение с четырьмя проектами:
- ManagedLibrary: библиотека C# для .NET
- MixedLibrary: библиотека, смешивающая собственный код C++ и код .NET из ManagedLibrary
- NativeApp: приложение C++, использующее код .NET из MixedLibrary
- ManagedApp: приложение C#, использующее код C++ из MixedLibrary
Выполните следующую команду, чтобы создать проекты решения:
msbuild CPP-CLI.sln -restore
Если сборка завершается ошибкой, убедитесь, что вы установили необходимые компоненты для Visual Studio, перечисленные в разделе предварительных требований, и соответствуете минимальным требованиям пакета SDK для .NET 5.0 или более поздней версии и Visual Studio 2019 16.8 или более поздней версии примера приложения.
После сборки можно запустить ManagedApp.exe
./bin/Debug/x64/ManagedApp.exe
Программа выдает следующие результаты.
=== 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. Открытие проекта в Visual Studio
В следующих шагах мы изменим библиотеку для fmt
печати сообщений в консоли. Библиотека fmt
будет установлена через vcpkg и связана с потребляющими проектами.
Чтобы изменить исходные файлы, откройте решение CPP-CLI.sln в Visual Studio:
start CPP-CLI.sln
После открытия решения в Visual Studio вы можете получить запрос на перенацелив проект до последних версий. Нажмите кнопку "ОК", чтобы обновить версию пакета SDK для Windows и набор инструментов платформы до последней версии.
Целевая версия пакета SDK для Windows и версия набора инструментов платформы проекта до последней версии.
Добавление собственной зависимости C++
Далее мы будем вносить следующие изменения в проект MixedLibrary.
- Добавьте манифест vcpkg для получения
fmt
. - Включите vcpkg в проекте.
- Измените используемый
NativeClass::Hello
дляfmt
печати сообщений.
1. Создание манифеста vcpkg
Щелкните правой кнопкой мыши проект NativeLibrary и нажмите кнопку "Добавить > новый элемент" в контекстном меню.
Присвойте новому элементу vcpkg.json
имя файла манифеста vcpkg и убедитесь, что файл создается в корневой папке проекта.
2. Добавление fmt
в качестве депedency
Откройте файл и измените его содержимое vcpkg.json
, чтобы он соответствовал следующим параметрам:
{
"dependencies": [ "fmt" ]
}
Если файл манифеста vcpkg расположен в правильном расположении, и вы попытаетесь создать проект, вы получите следующее предупреждение:
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. Включение vcpkg в свойствах MixedLibrary
Откройте страницу свойств MixedLibrary, щелкнув проект правой кнопкой мыши и выбрав пункт "Свойства".
Измените следующие свойства в разделе vcpkg:
- Использование Vcpkg , для параметра "Да"
- Использование манифеста Vcpkg с значением "Да"
- Для зависимостей Vcpkg установлено значение "Да"
- Использование автолинка, для параметра "Да"
- Локальное развертывание библиотек DLL для приложений с заданным значением "Да"
требуется для включения vcpkg
После этих изменений Visual Studio будет считывать vcpkg.json
файл и автоматически устанавливать зависимости, содержащиеся в манифесте перед созданием проекта.
Хотя на странице "Свойства" мы также хотим включить флаг для правильной /utf-8
fmt
сборки.
В подразделе командной строки параметров C/C++ измените дополнительные параметры, чтобы включить /utf-8
в него
Наконец, нажмите кнопку "ОК", чтобы закрыть страницу "Свойства".
4. Проверка работы vcpkg
Если все настроено правильно, Visual Studio вызовет vcpkg для установки зависимостей перед созданием проекта 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\"
Если выходные данные vcpkg не отображаются или fmt
не удается выполнить сборку, убедитесь, что вы выполнили описанные выше действия, включая добавление /utf-8
дополнительных параметров в командной строке C/C++ > .
4. Изменение исходного кода проекта
Наконец, мы хотим изменить MixedLibrary.cpp
файл для fmt
печати сообщений в консоли. Внесите следующие изменения в исходный код:
1. Включите заголовок (в строке fmt/printf.h
5).
#include <iostream>
#include <vcclr.h>
#include <fmt/printf.h>
2. Изменение используемой функции fmt::println
(в строке NativeClass::Hello
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);
}
Сборка приложения
Функция NativeClass::Hello
используется в проекте ManagedApp для печати сообщения в консоль с помощью кода C++. Приведенные выше изменения позволяют fmt
использовать библиотеку в приложении CLR.
Никаких изменений в проекте приложения не требуется, просто создайте и запустите проект ManagedApp.
Выходные данные программы должны выглядеть примерно так:
=== 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
Следующие шаги
Кроме того, узнайте о других полезных функциях: