Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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
- vcpkg
- Git
- Developer PowerShell untuk Visual Studio
- Visual Studio dengan komponen berikut:
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.
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::Helloagar menggunakanfmtuntuk 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
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: