Tutorial: Menginstal dependensi asli dalam aplikasi CLR

C++/CLI adalah teknologi yang memungkinkan Anda menggabungkan kelas .NET dengan jenis C++ asli untuk membuat pustaka dan aplikasi yang mengambil kode C++ dan membuatnya dapat diakses oleh program .NET.

Anda dapat menggunakan vcpkg dalam kombinasi dengan C++/CLI untuk menginstal dan menggunakan dependensi C++ dalam proyek Anda yang menargetkan Common Language Runtime (CLR).

Dalam tutorial ini, Anda akan belajar cara:

Prasyarat

Membuat sampel C++/CLI

Dalam tutorial ini, kita akan mulai dari aplikasi C++/CLI yang ada dan menambahkan dependensi C++ yang diinstal dengan vcpkg. Perintah dalam tutorial ini mengasumsikan bahwa Anda menjalankannya di Developer PowerShell untuk Visual Studio.

1 - Kloning repositori contoh

Langkah pertama adalah mendapatkan salinan aplikasi sampel C++/CLI di repositori sampel .NET. Aplikasi sampel C++/CLI terletak di core/interop/cpp-cli folder .

git clone https://github.com/dotnet/samples

2 - Navigasi ke folder aplikasi sampel

cd samples/core/interpo/cpp-cli

2 - Pastikan bahwa proyek berhasil dikompilasi dan berjalan dengan benar

Repositori sampel berisi solusi dengan empat proyek:

  • ManagedLibrary: Pustaka C# untuk .NET
  • MixedLibrary: Pustaka yang mencampur kode C++ asli dan kode .NET dari ManagedLibrary
  • NativeApp: Aplikasi C++ yang menggunakan kode .NET dari MixedLibrary
  • ManagedApp: Aplikasi C# yang menggunakan kode C++ dari MixedLibrary

Jalankan perintah berikut untuk membangun proyek solusi:

msbuild CPP-CLI.sln -restore

Jika build gagal, pastikan Anda telah menginstal komponen yang diperlukan untuk Visual Studio yang tercantum di bagian Prasyarat, dan Anda memenuhi persyaratan minimum .NET 5.0 SDK atau yang lebih baru dan Visual Studio 2019 16.8 atau yang lebih baru dari aplikasi sampel.

Setelah dibuat, Anda dapat menjalankan ManagedApp.exe

./bin/Debug/x64/ManagedApp.exe

Contoh ini menghasilkan output berikut:

=== 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 - Buka proyek di Visual Studio

Pada langkah berikutnya, kami akan memodifikasi pustaka agar menggunakan fmt untuk mencetak pesan ke konsol. Pustaka fmt akan diinstal melalui vcpkg dan ditautkan ke proyek yang menggunakannya.

Untuk mengedit file sumber, buka solusi CPP-CLI.sln di Visual Studio:

start CPP-CLI.sln

Setelah solusi dibuka di Visual Studio Anda mungkin mendapatkan perintah untuk menargetkan ulang proyek ke versi terbaru. Anda dapat mengklik OK untuk meningkatkan versi Windows SDK dan Platform Toolset ke yang terbaru.

Menargetkan ulang proyek yang ada

Ubah Versi Windows SDK target proyek dan versi Platform Toolset ke versi terbaru.

Menambahkan dependensi asli C++

Selanjutnya, kita akan membuat perubahan berikut pada proyek MixedLibrary.

  • Tambahkan manifes vcpkg untuk memperoleh fmt.
  • Aktifkan vcpkg dalam proyek.
  • Ubah NativeClass::Hello agar menggunakan fmt untuk mencetak pesan.

1 - Membuat manifes vcpkg

Klik kanan pada proyek NativeLibrary dan klik Tambahkan > Item Baru di menu konteks.

Beri nama item vcpkg.jsonbaru , ini adalah file manifes vcpkg, dan pastikan file dibuat di akar folder proyek.

2 - Tambahkan fmt sebagai depedensi

vcpkg.json Buka file dan edit kontennya agar sesuai dengan yang berikut ini:

{
  "dependencies": [ "fmt" ]
}

Jika file manifes vcpkg terletak di lokasi yang tepat dan Anda mencoba membangun proyek, Anda akan mendapatkan peringatan berikut:

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 - Mengaktifkan vcpkg di properti MixedLibrary

Buka halaman properti MixedLibrary dengan mengklik kanan proyek dan mengklik opsi Properti.

Ubah properti berikut di bagian vcpkg:

  • Gunakan Vcpkg diatur ke Ya
  • Gunakan Manifes Vcpkg diatur ke Ya
  • Dependensi Instal Vcpkg diatur ke Ya
  • Gunakan AutoLink diatur ke Ya
  • Menyebarkan DLL secara lokal ke aplikasi diatur ke Ya

Properti proyek MixedLibrary

diperlukan untuk mengaktifkan vcpkg

Dengan perubahan ini Visual Studio sekarang akan membaca vcpkg.json file dan secara otomatis menginstal dependensi yang terkandung dalam manifes sebelum membangun proyek.

Saat berada di halaman Properties, kami juga ingin mengaktifkan flag /utf-8 agar proses build fmt berjalan dengan benar.

Dalam subbagian Baris Perintah pada pengaturan C/C++, editlah Opsi Tambahan agar menyertakan /utf-8 di dalamnya

Terakhir, klik OK untuk menutup halaman Properti.

4 - Pastikan vcpkg berfungsi

Jika semuanya dikonfigurasi dengan benar, Visual Studio akan memanggil vcpkg untuk menginstal dependensi Anda sebelum membangun proyek 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\"

Jika Anda tidak melihat output vcpkg, atau jika fmt gagal membangun, pastikan Anda mengikuti langkah-langkah di atas dengan benar, termasuk menambahkan /utf-8 di Opsi Tambahan di Baris Perintah C/C++ > .

4 - Ubah kode sumber proyek

Terakhir, kami ingin memodifikasi file MixedLibrary.cpp agar menggunakan fmt untuk mencetak pesan ke konsol. Buat perubahan berikut pada kode sumber:

1 - Sertakan fmt/printf.h header (pada baris 5).

#include <iostream>
#include <vcclr.h>
#include <fmt/printf.h>

2 - Ubah fungsi NativeClass::Hello agar menggunakan fmt::println (pada baris 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);
}

Membangun aplikasi

Fungsi ini NativeClass::Hello digunakan dalam proyek ManagedApp untuk mencetak pesan ke konsol menggunakan kode C++. Perubahan di atas membuat pustaka fmt digunakan dalam aplikasi CLR.

Tidak ada perubahan pada proyek aplikasi yang diperlukan, cukup bangun dan jalankan proyek ManagedApp.

Output program akan terlihat mirip dengan ini:

=== 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

Langkah berikutnya

Pelajari juga tentang fitur berguna lainnya: