Bagikan melalui


Menyesuaikan penyusunan parameter

Ketika perilaku marshaling parameter default dari .NET runtime tidak sesuai dengan keinginan Anda, Anda dapat menggunakan atribut System.Runtime.InteropServices.MarshalAsAttribute untuk menyesuaikan bagaimana parameter Anda diatur. Fitur kustomisasi ini tidak berlaku saat marshalling runtime dinonaktifkan.

Nota

Interop yang dihasilkan sumber untuk P/Invokes dan COM hanya berlaku pada subset kecil dari atribut parameter MarshalAsAttribute. Disarankan untuk digunakan MarshalUsingAttribute untuk interop yang dihasilkan sumber sebagai gantinya. Untuk informasi selengkapnya, lihat Marshalling kustom untuk pembuatan sumber.

Menyesuaikan parameter string

.NET memiliki berbagai format untuk string marshalling. Metode ini dibagi menjadi bagian yang berbeda untuk string gaya C dan format string yang berfokus pada Windows.

String gaya C

Masing-masing format ini meneruskan string null-terminated ke kode asli. Mereka berbeda berdasarkan pengodean string asli.

System.Runtime.InteropServices.UnmanagedType nilai Pengkodean
LPStr ANSI
LPUTF8Str UTF-8
LPWStr UTF-16
LPTStr UTF-16

UnmanagedType.VBByRefStr Formatnya sedikit berbeda. Seperti LPWStr, ia mengonversi string ke string bergaya C yang asli dan dikodekan dalam UTF-16. Namun, signature yang dikelola memerlukan Anda untuk memasukkan string dengan referensi, sedangkan signature asli yang cocok mengambil string dengan nilai. Perbedaan ini memungkinkan Anda menggunakan API asli yang mengambil string berdasarkan nilai dan memodifikasinya di tempat tanpa harus menggunakan StringBuilder. Kami menyarankan untuk tidak menggunakan format ini secara manual karena rentan menyebabkan kebingungan dengan tanda tangan asli dan terkelola yang tidak cocok.

Format string yang berfokus pada Windows

Saat berinteraksi dengan antarmuka COM atau OLE, Anda mungkin akan menemukan bahwa fungsi asli mengambil string sebagai BSTR argumen. Anda dapat menggunakan UnmanagedType.BStr jenis yang tidak dikelola untuk memarshalkan string sebagai BSTR.

Jika berinteraksi dengan API WinRT, Anda dapat menggunakan format UnmanagedType.HString untuk memaketkan string sebagai HSTRING.

Menyesuaikan parameter array

.NET juga menyediakan beberapa cara bagi Anda untuk mengelola parameter array. Jika Anda memanggil API yang memerlukan array dengan gaya C, gunakan jenis UnmanagedType.LPArray yang tidak terkelola. Jika nilai dalam array memerlukan marshalling yang disesuaikan, Anda dapat menggunakan bidang ArraySubType pada atribut [MarshalAs] untuk keperluan tersebut.

Jika Anda menggunakan API COM, Anda mungkin harus melakukan "marshal" parameter array Anda sebagai SAFEARRAY*. Untuk melakukannya, Anda dapat menggunakan tipe yang tidak dikelola UnmanagedType.SafeArray. Jenis default elemen SAFEARRAY dapat dilihat dalam tabel pada penyesuaian bidangobject. Anda dapat menggunakan bidang MarshalAsAttribute.SafeArraySubType dan MarshalAsAttribute.SafeArrayUserDefinedSubType untuk menyesuaikan jenis elemen yang tepat dari SAFEARRAY.

Menyesuaikan parameter Boolean atau desimal

Untuk informasi tentang pemrosesan Boolean atau parameter desimal, lihat Menyesuaikan pemrosesan struktur.

Menyesuaikan parameter objek (khusus Windows)

Di Windows, runtime .NET menyediakan sejumlah cara berbeda untuk mengelola parameter objek ke kode asli.

Marshalling sebagai antarmuka COM tertentu

Jika API Anda menerima penunjuk ke objek COM, Anda dapat menggunakan salah satu format berikut UnmanagedType pada parameter bertipe object untuk memberi tahu .NET mengalihkan sebagai antarmuka spesifik ini:

  • IUnknown
  • IDispatch
  • IInspectable

Selain itu, jika jenis Anda ditandai [ComVisible(true)] atau Anda melakukan penggabungan jenis object, Anda dapat menggunakan format UnmanagedType.Interface untuk menggabungkan objek Anda sebagai pembungkus yang dapat dipanggil oleh COM untuk tampilan COM dari jenis Anda.

Marsekal ke VARIANT

Jika API asli Anda menerima Win32 VARIANT, Anda dapat menggunakan format UnmanagedType.Struct pada object parameter Anda untuk memarshall objek Anda sebagai VARIANT. Lihat dokumentasi tentang menyesuaikan object bidang untuk pemetaan antara jenis .NET dan jenis VARIANT.

Kustom marshaller

Jika Anda ingin memproyeksikan antarmuka COM asli ke dalam jenis terkelola yang berbeda, Anda dapat menggunakan format UnmanagedType.CustomMarshaler dan implementasi ICustomMarshaler untuk menyediakan kode kustom marshalling Anda sendiri.