Aracılığıyla paylaş


Parametre marshalling'ini özelleştirme

.NET çalışma zamanının varsayılan parametre hazırlama davranışı istediğiniz işlemi gerçekleştirmediğinde, parametrelerinizin nasıl hazırlanmasını özelleştirmek için özniteliğini kullanabilirsiniz System.Runtime.InteropServices.MarshalAsAttribute . Çalışma zamanı hazırlama devre dışı bırakıldığında bu özelleştirme özellikleri geçerli değildir.

Uyarı

P/Invokes ve COM için kaynak tarafından oluşturulan birlikte çalışma yalnızca parametrelerin küçük bir alt kümesine MarshalAsAttribute saygı gösterir. Bunun yerine kaynak tarafından oluşturulan birlikte çalışma için kullanılması MarshalUsingAttribute önerilir. Daha fazla bilgi için bkz. Kaynak oluşturma için özel sıralama.

Dize parametrelerini özelleştirme

.NET, dizeleri sıralamak için çeşitli biçimlere sahiptir. Bu yöntemler, C stili dizelerde ve Windows merkezli dize biçimlerinde ayrı bölümlere ayrılır.

C stili stringler

Bu biçimlerin her biri yerel koda null olarak sonlandırılan bir dize geçirir. Bunlar yerel dizenin kodlamasına göre farklılık gösterir.

System.Runtime.InteropServices.UnmanagedType değer Kodlama
LPStr Amerikan Ulusal Standartlar Enstitüsü (ANSI)
LPUTF8Str UTF-8
LPWStr UTF-16
LPTStr UTF-16

Biçim UnmanagedType.VBByRefStr biraz farklıdır. gibi LPWStr, dizeyi UTF-16'da kodlanmış yerel bir C stili dizeye sıralar. Ancak, yönetilen imza dizeyi referans olarak geçirmenizi sağlar ve eşleşen yerel imza dizeyi değere göre alır. Bu ayrım, bir dizeyi değer olarak alıp yerinde değiştirebilen yerel bir API'yi StringBuilder kullanmadan kullanmanıza olanak tanır. Eşleşmeyen yerel ve yönetilen imzalarla karışıklığa neden olabileceğinden, bu biçimi el ile kullanmamanızı öneririz.

Windows merkezli dize biçimleri

COM veya OLE arabirimleriyle etkileşim kurarken, büyük olasılıkla fonksiyonların dizeleri bağımsız değişkenler olarak BSTR alacağını göreceksiniz. Bir dizeyi BSTR olarak aktarabilmek için UnmanagedType.BStr yönetilmeyen türü kullanabilirsiniz.

WinRT API'leriyle etkileşimdeyseniz, bir dizeyi UnmanagedType.HString olarak HSTRING'ye yerleştirmek için bu biçimi kullanabilirsiniz.

Dizi parametrelerini özelleştirme

.NET ayrıca dizi parametrelerini sıralamak için birden çok yol sağlar. C stili bir dizi alan bir API'yi çağırıyorsanız yönetilmeyen türü kullanın UnmanagedType.LPArray . Dizideki değerlerin özelleştirilmiş bir sıralamaya ihtiyacı varsa, bunun için özniteliğindeki [MarshalAs] alanını kullanabilirsinizArraySubType.

COM API'leri kullanıyorsanız, dizi parametrelerinizi büyük olasılıkla s olarak SAFEARRAY*hazırlamanız gerekir. Bunu yapmak için yönetilmeyen türü kullanabilirsiniz UnmanagedType.SafeArray . SAFEARRAY öğelerinin varsayılan türü, alanları özelleştirme object tablosunda görülebilir. ve MarshalAsAttribute.SafeArrayUserDefinedSubType alanlarını kullanarak MarshalAsAttribute.SafeArraySubType öğesinin tam öğe türünü SAFEARRAYözelleştirebilirsiniz.

Boole veya ondalık parametreleri özelleştirme

Boole veya ondalık parametreleri sıralama hakkında bilgi için bkz. Yapı hazırlamayı özelleştirme.

Nesne parametrelerini özelleştirme (yalnızca Windows)

Windows'da .NET çalışma zamanı, nesne parametrelerini yerel koda hazırlamanın çeşitli yollarını sağlar.

BELİRLİ COM arabirimleri olarak dizgileme

API'niz bir COM nesnesine işaretçi alırsa, .NET'e bu belirli arabirimler olarak sıralamasını bildirmek için object türündeki bir parametrede aşağıdaki UnmanagedType biçimlerden herhangi birini kullanabilirsiniz.

  • IUnknown
  • IDispatch
  • IInspectable

Ayrıca, eğer türünüz [ComVisible(true)] olarak işaretlendiyse veya object türünü taşıyorsanız, türünüzün COM görünümü için nesnenizi COM çağrılabilir bir sarmalayıcı olarak taşımak amacıyla UnmanagedType.Interface biçimini kullanabilirsiniz.

Bir'e göre sıralama VARIANT

Yerel API'niz bir Win32 VARIANT alırsa, nesnelerinizi VARIANTler olarak düzenlemek için UnmanagedType.Struct biçimini object parametrenizde kullanabilirsiniz. .NET türleri ile VARIANT türleri arasında eşleme hakkında bilgi için object alanları özelleştirme belgelerine bakın.

Özel düzenleyiciler

Yerel bir COM arabirimini farklı bir yönetilen türe yansıtmak istiyorsanız, kendi özel marşhaling kodunuzu sağlamak için UnmanagedType.CustomMarshaler biçimini ve ICustomMarshaler uygulamasını kullanabilirsiniz.