Bagikan melalui


Menyesuaikan marshalling parameter

Ketika perilaku pengaturan parameter default runtime .NET tidak melakukan apa yang Anda inginkan, gunakan dapat menggunakan System.Runtime.InteropServices.MarshalAsAttribute atribut untuk menyesuaikan bagaimana parameter Anda disusun. Fitur penyesuaian ini tidak berlaku saat marshalling runtime bahasa umum dinonaktifkan.

Catatan

Interop yang dihasilkan sumber untuk P/Invokes dan COM hanya menghormati subset kecil pada MarshalAsAttribute parameter. 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 marshalling string. Metode ini dibagi menjadi bagian yang berbeda pada string gaya C dan format string Windows-sentris.

String gaya C

Masing-masing format ini meneruskan string yang dihentikan null ke kode asli. Mereka berbeda dengan pengodean string asli.

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

Formatnya UnmanagedType.VBByRefStr sedikit berbeda. Seperti LPWStr, itu marsekal string ke string gaya C asli yang dikodekan dalam UTF-16. Namun, tanda tangan terkelola membuat Anda meneruskan string dengan referensi dan tanda tangan asli yang cocok mengambil string berdasarkan 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 ketidakcocokan tanda tangan asli dan terkelola.

format string Windows-sentris

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 marshal string sebagai BSTR.

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

Menyesuaikan parameter array

.NET juga memberi Anda beberapa cara untuk parameter array marshal. Jika Anda memanggil API yang mengambil array gaya C, gunakan jenis yang UnmanagedType.LPArray tidak dikelola. Jika nilai dalam array memerlukan marshalling yang disesuaikan, Anda dapat menggunakan ArraySubType bidang pada [MarshalAs] atribut untuk itu.

Jika Anda menggunakan API COM, Anda mungkin harus marshal parameter array Anda sebagai SAFEARRAY*. Untuk melakukannya, Anda dapat menggunakan UnmanagedType.SafeArray jenis yang tidak dikelola. Jenis default elemen SAFEARRAY dapat dilihat dalam tabel pada bidang object penyesuaian. 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 marshalling Boolean atau parameter desimal, lihat Menyesuaikan marshalling struktur.

Menyesuaikan parameter objek (hanya Windows)

Pada Windows, runtime bahasa umum .NET menyediakan sejumlah cara berbeda untuk parameter objek marshal ke kode asli.

Marshalling sebagai antarmuka COM tertentu

Jika API Anda mengarahkan pointer ke objek COM, Anda dapat menggunakan salah satu UnmanagedType format berikut pada objectparameter yang diketik untuk memberi tahu .NET ke marshal sebagai antarmuka khusus ini:

  • IUnknown
  • IDispatch
  • IInspectable

Selain itu, jika jenis Anda ditandai [ComVisible(true)] atau Anda sedang marshalling object jenis, Anda dapat menggunakan UnmanagedType.Interface format untuk marshal objek Anda sebagai pembungkus yang dapat dipanggil COM untuk tampilan COM jenis Anda.

Marshalling ke VARIANT

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

Marshaller kustom

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