Руководство. Установка собственных зависимостей в приложении CLR
Статья
C++/CLI — это технология, которая позволяет объединять классы .NET с собственными типами C++ для создания библиотек и приложений, которые принимают код C++ и делают его доступными для программ .NET.
Вы можете использовать vcpkg в сочетании с C++/CLI для установки и использования зависимостей C++ в проектах, предназначенных для среды CLR.
В этом руководстве мы начнем с существующего приложения 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-8fmt сборки.
В подразделе командной строки параметров C/C++ измените дополнительные параметры, чтобы включить /utf-8 в него
Наконец, нажмите кнопку "ОК", чтобы закрыть страницу "Свойства".
4. Проверка работы vcpkg
Если все настроено правильно, Visual Studio вызовет vcpkg для установки зависимостей перед созданием проекта MixedLibrary.
Если выходные данные vcpkg не отображаются или fmt не удается выполнить сборку, убедитесь, что вы выполнили описанные выше действия, включая добавление /utf-8 дополнительных параметров в командной строке C/C++ > .
4. Изменение исходного кода проекта
Наконец, мы хотим изменить MixedLibrary.cpp файл для fmt печати сообщений в консоли. Внесите следующие изменения в исходный код:
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
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Отзыв о vcpkg
vcpkg — это проект с открытым исходным кодом. Выберите ссылку, чтобы оставить отзыв:
Создайте проект .NET и узнайте, как добавлять пакеты и управлять зависимостями пакетов в проекте. Используйте .NET Core CLI и реестр NuGet для добавления библиотек и средств в приложения C# с помощью Visual Studio Code.