Bagikan melalui


/clr Pembatasan

Perhatikan batasan berikut tentang penggunaan /clr:

  • Dalam handler pengecualian terstruktur, ada batasan penggunaan _alloca saat mengkompilasi dengan /clr. Untuk informasi selengkapnya, lihat _alloca .

  • Penggunaan pemeriksaan kesalahan run-time tidak valid dengan /clr. Untuk informasi selengkapnya, lihat Cara: Menggunakan pemeriksaan run-time asli.

  • Ketika /clr digunakan untuk mengkompilasi program yang hanya menggunakan sintaks C++ standar, panduan berikut berlaku untuk penggunaan rakitan sebaris:

    • Kode rakitan sebaris yang mengasumsikan pengetahuan tentang tata letak tumpukan asli, konvensi panggilan di luar fungsi saat ini, atau informasi tingkat rendah lainnya tentang komputer mungkin gagal jika pengetahuan tersebut diterapkan ke bingkai tumpukan untuk fungsi terkelola. Fungsi yang berisi kode rakitan sebaris dihasilkan sebagai fungsi yang tidak dikelola, seolah-olah ditempatkan dalam modul terpisah yang dikompilasi tanpa /clr.

    • Kode rakitan sebaris dalam fungsi yang meneruskan parameter fungsi yang dibangun salinan tidak didukung.

  • Fungsi vprintf tidak dapat dipanggil dari program yang dikompilasi dengan /clr.

  • Pengubah naked__declspec diabaikan di bawah /clr.

  • Fungsi penerjemah yang ditetapkan oleh _set_se_translator hanya akan memengaruhi tangkapan dalam kode yang tidak dikelola. Untuk informasi selengkapnya, lihat Penanganan pengecualian.

  • Perbandingan pointer fungsi tidak diizinkan di bawah /clr.

  • Penggunaan fungsi yang tidak sepenuhnya diprototi tidak diizinkan di bawah /clr.

  • Opsi pengkompilasi berikut tidak didukung dengan /clr:

  • Kombinasi _STATIC_CPPLIB definisi pra-prosesor (/D_STATIC_CPPLIB) dan /clr opsi pengkompilasi tidak didukung. Ini karena definisi akan menyebabkan aplikasi Anda ditautkan dengan Pustaka Standar C++ statis dan multithreaded, yang tidak didukung. Untuk informasi selengkapnya, lihat /MD, , /LD/MT(Gunakan Pustaka Run-Time).

  • Saat Anda menggunakan /Zi dengan /clr, ada implikasi performa. Untuk informasi selengkapnya, lihat /Zi .

  • Meneruskan karakter lebar ke rutinitas output .NET Framework tanpa juga menentukan /Zc:wchar_t atau tanpa mentransmisikan karakter _wchar_t akan menyebabkan output muncul sebagai unsigned short int. Contohnya:

    Console::WriteLine(L' ')              // Will output 32.
    Console::WriteLine((__wchar_t)L' ')   // Will output a space.
    
  • /GS diabaikan saat mengkompilasi dengan /clr, kecuali fungsi berada di bawah #pragma unmanaged atau jika fungsi harus dikompilasi sebagai kode asli, dalam hal ini pengkompilasi akan menghasilkan peringatan C4793, yang nonaktif secara default.

  • Lihat /ENTRY untuk persyaratan tanda tangan fungsi aplikasi terkelola.

  • Aplikasi yang dikompilasi dengan /openmp dan /clr hanya dapat dijalankan dalam satu proses appdomain. Untuk informasi selengkapnya, lihat /openmp (Aktifkan Dukungan OpenMP 2.0).

  • Fungsi yang mengambil jumlah variabel argumen (varargs) akan dihasilkan sebagai fungsi asli. Setiap jenis data terkelola dalam posisi argumen variabel akan dinamai ke jenis asli. Jenis apa pun System.String sebenarnya adalah string karakter lebar, tetapi dinamai ke string karakter byte tunggal. Jadi jika penentu printf adalah %S (wchar_t*), itu akan marshal ke %s string sebagai gantinya.

  • Saat menggunakan va_arg makro, Anda mungkin mendapatkan hasil yang tidak terduga saat mengkompilasi dengan /clr:pure. Untuk informasi selengkapnya, lihat va_arg, va_copy, va_end, va_start. Opsi /clr:pure pengkompilasi dan /clr:safe tidak digunakan lagi di Visual Studio 2015 dan tidak didukung di Visual Studio 2017 dan yang lebih baru. Kode yang harus "murni" atau "aman" harus di-port ke C#.

  • Anda tidak boleh memanggil fungsi apa pun yang berjalan di tumpukan untuk mendapatkan informasi parameter (argumen fungsi) dari kode terkelola. Lapisan P/Invoke menyebabkan informasi tersebut lebih jauh ke bawah tumpukan. Misalnya, jangan mengkompilasi proksi/stub dengan /clr.

  • Fungsi akan dikompilasi ke kode terkelola jika memungkinkan, tetapi tidak semua konstruksi C++ dapat diterjemahkan ke kode terkelola. Penentuan ini dibuat berdasarkan fungsi demi fungsi. Jika ada bagian dari fungsi yang tidak dapat dikonversi ke kode terkelola, seluruh fungsi akan dikonversi ke kode asli sebagai gantinya. Kasus berikut mencegah pengkompilasi menghasilkan kode terkelola.

    • Thunks yang dihasilkan kompilator atau fungsi pembantu. Thunk asli dihasilkan untuk panggilan fungsi apa pun melalui penunjuk fungsi, termasuk panggilan fungsi virtual.

    • Fungsi yang memanggil setjmp atau longjmp.

    • Fungsi yang menggunakan rutinitas intrinsik tertentu untuk memanipulasi sumber daya mesin secara langsung. Misalnya, penggunaan __enable intrinsik dan __disable, _ReturnAddress dan _AddressOfReturnAddress, atau multimedia semuanya akan menghasilkan kode asli.

    • Fungsi yang mengikuti arahan #pragma unmanaged . (Inversi, #pragma managed, juga didukung.)

    • Fungsi yang berisi referensi ke jenis yang diratakan, yaitu jenis yang dideklarasikan menggunakan __declspec(align(...)).

Baca juga