Dimulai dengan Visual Studio 2019, proyek C++/CLI dapat menargetkan .NET. Dukungan ini memungkinkan port aplikasi desktop Windows dengan lapisan interop C++/CLI dari .NET Framework ke .NET. Artikel ini menjelaskan cara mem-port proyek C++/CLI dari .NET Framework ke .NET.
Batasan C++/CLI .NET Core
Ada beberapa batasan penting dengan proyek C++/CLI dan .NET dibandingkan dengan .NET Framework:
Mengkompilasi proyek C++/CLI ke yang dapat dieksekusi tidak didukung. Anda harus mengkompilasi ke DLL.
Dukungan C++/CLI untuk .NET hanya Windows.
Proyek C++/CLI tidak dapat menargetkan .NET Standard.
Proyek C++/CLI tidak mendukung format file proyek bergaya SDK yang lebih baru. Sebagai gantinya, proyek C++/CLI menggunakan format file .vcxproj yang sama dengan yang digunakan proyek Visual Studio C++ lainnya.
Proyek C++/CLI tidak dapat menargetkan beberapa platform .NET. Jika Anda perlu membangun proyek C++/CLI untuk .NET dan .NET Framework, gunakan file proyek terpisah.
.NET tidak mendukung -clr:pure atau -clr:safe kompilasi, hanya opsi yang lebih -clr:netcore baru (yang setara dengan -clr untuk .NET Framework).
Port proyek C++/CLI
Untuk memindahkan proyek C++/CLI ke .NET, buat perubahan berikut pada file .vcxproj . Langkah-langkah migrasi ini berbeda dari langkah-langkah yang diperlukan untuk jenis proyek lain karena proyek C++/CLI tidak menggunakan file proyek bergaya SDK.
Ganti <CLRSupport>true</CLRSupport> properti dengan <CLRSupport>NetCore</CLRSupport>. Properti ini sering berada dalam grup properti khusus konfigurasi, jadi Anda mungkin perlu menggantinya di beberapa tempat.
Ganti <TargetFrameworkVersion> properti dengan <TargetFramework>net8.0</TargetFramework>. Pastikan untuk mengubah tag dan nilai.
Hapus referensi .NET Framework apa pun ke System, , System.Windows.FormsSystem.Data, dan System.Xml, seperti <Reference Include="System" />. Rakitan .NET SDK secara otomatis dirujuk saat menggunakan <CLRSupport>NetCore</CLRSupport>.
Perbarui penggunaan API dalam file .cpp , seperlunya, untuk menghapus API yang tidak tersedia untuk .NET. Karena proyek C++/CLI cenderung cukup tipis lapisan interop, sering kali tidak banyak perubahan yang diperlukan. Anda dapat menggunakan .NET Portability Analyzer untuk mengidentifikasi API .NET yang tidak didukung yang digunakan oleh biner C++/CLI.
Jika proyek Anda dapat dieksekusi, lakukan langkah-langkah berikut:
Ubah jenis proyek menjadi pustaka.
Buat proyek .NET executable baru.
Dalam proyek .NET executable, tambahkan referensi pustaka C++/CLI .NET.
Penggunaan WPF dan Formulir Windows
Proyek .NET C++/CLI dapat menggunakan API Formulir Windows dan WPF. Untuk menggunakan API desktop Windows ini, Anda perlu menambahkan referensi kerangka kerja eksplisit ke pustaka UI. Proyek bergaya SDK yang menggunakan API desktop Windows mereferensikan pustaka kerangka kerja yang diperlukan secara otomatis dengan menggunakan Microsoft.NET.Sdk.WindowsDesktop SDK. Karena proyek C++/CLI tidak menggunakan format proyek gaya SDK, proyek tersebut perlu menambahkan referensi kerangka kerja eksplisit saat menargetkan .NET Core.
Untuk menggunakan API Formulir Windows, tambahkan referensi ini ke file .vcxproj:
<!-- Reference all of Windows Forms -->
<FrameworkReference Include="Microsoft.WindowsDesktop.App.WindowsForms" />
Untuk menggunakan API WPF, tambahkan referensi ini ke file .vcxproj :
<!-- Reference all of WPF -->
<FrameworkReference Include="Microsoft.WindowsDesktop.App.WPF" />
Untuk menggunakan API Formulir Windows dan WPF, tambahkan referensi ini ke file .vcxproj:
<!-- Reference the entirety of the Windows desktop framework:
Windows Forms, WPF, and the types that provide integration between them -->
<FrameworkReference Include="Microsoft.WindowsDesktop.App" />
Saat ini, tidak dimungkinkan untuk menambahkan referensi ini dengan menggunakan manajer referensi Visual Studio. Sebagai gantinya, perbarui file proyek dengan mengeditnya secara manual. Di Visual Studio, Anda perlu membongkar proyek terlebih dahulu. Anda juga dapat menggunakan editor lain seperti Visual Studio Code.
Membangun tanpa MSBuild
Anda juga dapat membangun proyek C++/CLI tanpa menggunakan MSBuild. Ikuti langkah-langkah ini untuk membangun proyek C++/CLI untuk .NET Core secara langsung dengan cl.exe dan link.exe:
Saat mengkompilasi, teruskan -clr:netcore ke cl.exe.
Referensi rakitan referensi .NET yang diperlukan.
Saat menautkan, berikan direktori host aplikasi .NET sebagai LibPath, sehingga ijwhost.lib dapat ditemukan.
Salin ijwhost.dll dari direktori host aplikasi .NET ke direktori output proyek.
Pastikan file runtimeconfig.json ada untuk komponen pertama aplikasi yang menjalankan kode terkelola. Untuk versi terbaru Visual Studio, file runtime.config dibuat dan disalin secara otomatis.
Untuk versi Visual Studio yang lebih lama, jika aplikasi memiliki titik masuk asli, Anda perlu membuat file runtimeconfig.json berikut secara manual untuk pustaka C++/CLI pertama untuk menggunakan runtime .NET. Jika pustaka C++/CLI dipanggil dari titik entri terkelola, pustaka tidak memerlukan file runtimeconfig.json , karena rakitan titik masuk memiliki yang digunakan saat memulai runtime.
Rakitan C++/CLI yang menargetkan .NET 7 atau versi yang lebih baru selalu dimuat ke dalam default AssemblyLoadContext. Namun, dalam .NET 6 dan versi yang lebih lama, rakitan C++/CLI mungkin dimuat beberapa kali, setiap kali ke dalam baru AssemblyLoadContext. Jika pertama kalinya kode terkelola dalam rakitan C++/CLI dijalankan:
Berasal dari penelepon asli, rakitan dimuat ke dalam terpisah AssemblyLoadContext.
Berasal dari penelepon terkelola, rakitan dimuat ke sama dengan AssemblyLoadContext pemanggil, biasanya default.
Untuk selalu memuat rakitan C++/CLI Anda ke default AssemblyLoadContext, Anda dapat menambahkan panggilan gaya "inisialisasi" dari rakitan titik entri Anda ke rakitan C++/CLI Anda. Untuk informasi selengkapnya, lihat masalah dotnet/runtime ini.
Berkolaborasi dengan kami di GitHub
Sumber untuk konten ini dapat ditemukan di GitHub, yang juga dapat Anda gunakan untuk membuat dan meninjau masalah dan menarik permintaan. Untuk informasi selengkapnya, lihat panduan kontributor kami.
Umpan balik .NET
.NET adalah proyek sumber terbuka. Pilih tautan untuk memberikan umpan balik:
.NET adalah platform pengembang sumber terbuka gratis, lintas platform untuk membangun berbagai jenis aplikasi. Dengan .NET, Anda dapat menggunakan beberapa bahasa, editor, dan pustaka untuk membangun situs, seluler, desktop, permainan, dan IoT.