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 object
parameter 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.
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk