C++/CLI は、.NET クラスとネイティブ C++ 型を組み合わせて、C++ コードを受け取り、.NET プログラムからアクセスできるようにするライブラリとアプリケーションを作成できるテクノロジです。
vcpkg を C++/CLI と組み合わせて使用して、 Common Language Runtime (CLR)をターゲットとするプロジェクトに C++ 依存関係をインストールして使用できます。
このチュートリアルでは、次の内容を学習します。
前提条件
- vcpkg
- Git
- Developer Powershell for Visual Studio
- Visual Studio 次のコンポーネントを使用します。
サンプル C++/CLI をビルドする
このチュートリアルでは、既存の C++/CLI アプリケーションから開始し、vcpkg と共にインストールされた C++ の依存関係を追加します。 このチュートリアルのコマンドは、 Developer PowerShell for Visual Studio で実行していることを前提としています。
1 - サンプル リポジトリを複製する
最初の手順は、 .NET サンプル リポジトリで C++/CLI サンプル アプリケーションのコピーを取得することです。 C++/CLI サンプル アプリケーションは、 core/interop/cpp-cli フォルダーにあります。
git clone https://github.com/dotnet/samples
2 - サンプル アプリケーション フォルダーに移動する
cd samples/core/interpo/cpp-cli
2 - プロジェクトが正しくビルドおよび実行されていることを確認する
サンプル リポジトリには、次の 4 つのプロジェクトを含むソリューションが含まれています。
- ManagedLibrary: .NET 用 C# ライブラリ
- MixedLibrary: ManagedLibrary のネイティブ C++ コードと .NET コードを混在するライブラリ
- NativeApp: MixedLibrary から .NET コードを使用する C++ アプリケーション
- ManagedApp: MixedLibrary から C++ コードを使用する C# アプリケーション
次のコマンドを実行して、ソリューションのプロジェクトをビルドします。
msbuild CPP-CLI.sln -restore
ビルドが失敗した場合は、「Prerequisites」セクションに記載されている Visual Studio に必要なコンポーネントがインストールされていること、および sample アプリケーションの .NET 5.0 SDK 以降と 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 経由でインストールされ、使用しているプロジェクトにリンクされます。
ソース ファイルを編集するには、Visual Studio で CPP-CLI.sln ソリューションを開きます。
start CPP-CLI.sln
Visual Studio でソリューションを開くと、プロジェクトのターゲットを最新バージョンに変更するように求めるメッセージが表示されることがあります。 [OK] をクリックすると、Windows SDK バージョンとプラットフォーム ツールセットを最新のバージョンにアップグレードできます。
プロジェクトのターゲット Windows SDK バージョンとプラットフォーム ツールセットのバージョンを最新バージョンにします。
C++ ネイティブ依存関係を追加する
次に、MixedLibrary プロジェクトに次の変更を加えます。
fmtを取得する vcpkg マニフェストを追加します。- プロジェクトで vcpkg を有効にします。
fmtを使用してメッセージを印刷するようにNativeClass::Helloを変更します。
1 - vcpkg マニフェストを作成する
NativeLibrary プロジェクトを右クリックし、コンテキスト メニューの [新しい項目 > 追加] をクリックします。
新しい項目に vcpkg.json名前を付けます。これは vcpkg マニフェスト ファイルです。ファイルがプロジェクトのフォルダーのルートに作成されていることを確認します。
2 - fmt を使い捨てとして追加する
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 - MixedLibrary のプロパティで vcpkg を有効にする
プロジェクトを右クリックし、[プロパティ] オプションをクリックして、MixedLibrary のプロパティ ページを開きます。
vcpkg セクションで次のプロパティを変更します。
- Vcpkg を使用 Yes に設定する
- Vcpkg マニフェストを使用 Yes に設定する
- Instal Vcpkg Dependencies Yes に設定
- AutoLink を使用 Yes に設定する
- アプリでローカルに DLL をデプロイ Yes に設定する
vcpkg を有効にするために必要
これらの変更により、Visual Studio はプロジェクトをビルドする前に、 vcpkg.json ファイルを読み取り、マニフェストに含まれる依存関係を自動的にインストールします。
[プロパティ] ページでは、 /utf-8 フラグを有効にして、 fmt ビルドを正しく行うこともできます。
C/C++ 設定のコマンド ライン サブセクションで、追加オプションを編集して、 /utf-8 を
最後に、[OK] をクリックして [プロパティ] ページを閉じます。
4 - vcpkg が動作していることを確認する
すべてが正しく構成されている場合、Visual Studio は、MixedLibrary プロジェクトをビルドする前に vcpkg を呼び出して依存関係をインストールします。
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ビルドに失敗した場合は、C/C++ の追加オプション>コマンド ラインに/utf-8を追加するなど、上記の手順に正しく従っていることを確認してください。
4 - プロジェクトのソース コードを変更する
最後に、fmtを使用してコンソールにメッセージを出力するように、MixedLibrary.cpp ファイルを変更します。 ソース コードに次の変更を加えます。
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++ コードを使用してコンソールにメッセージを出力するために使用されます。 上記の変更により、
アプリケーションのプロジェクトには必要ありません。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
次のステップ
その他の便利な機能についても説明します。
vcpkg