Прочитать на английском

Поделиться через


Руководство. Установка собственных зависимостей в приложении CLR

C++/CLI — это технология, которая позволяет объединять классы .NET с собственными типами C++ для создания библиотек и приложений, которые принимают код C++ и делают его доступными для программ .NET.

Вы можете использовать vcpkg в сочетании с C++/CLI для установки и использования зависимостей C++ в проектах, предназначенных для среды CLR.

В этом учебнике рассматривается следующее.

Необходимые компоненты

Создание примера 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 для приложений с заданным значением "Да"

Свойства проекта MixedLibrary

требуется для включения 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

Следующие шаги

Кроме того, узнайте о других полезных функциях: