Baca dalam bahasa Inggris

Bagikan melalui


Cara memindahkan proyek C++/CLI ke .NET

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.

  1. 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.
  2. Ganti <TargetFrameworkVersion> properti dengan <TargetFramework>net8.0</TargetFramework>. Pastikan untuk mengubah tag dan nilai.
  3. 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>.
  4. 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.
  5. Jika proyek Anda dapat dieksekusi, lakukan langkah-langkah berikut:
    1. Ubah jenis proyek menjadi pustaka.
    2. Buat proyek .NET executable baru.
    3. 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:

  1. Saat mengkompilasi, teruskan -clr:netcore ke cl.exe.

  2. Referensi rakitan referensi .NET yang diperlukan.

  3. Saat menautkan, berikan direktori host aplikasi .NET sebagai LibPath, sehingga ijwhost.lib dapat ditemukan.

  4. Salin ijwhost.dll dari direktori host aplikasi .NET ke direktori output proyek.

  5. 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.

    {
       "runtimeOptions": {
          "tfm": "net8.0",
          "framework": {
          "name": "Microsoft.NETCore.App",
          "version": "8.0.0"
          }
       }
    }
    

Catatan

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.