Aracılığıyla paylaş


.NET etkileşiminde örtük yöntem imza çevirileri

Programlama dilinin belirsiz kalmasını sağlamak için, Windows COM sistemi ve birçok Windows API'sinin 4 bayt tamsayı türü HRESULT döndürerek API'nin başarılı veya başarısız olup olmadığını ve hatayla ilgili bazı bilgileri gösterir. Çağırana geçirilmesi gereken diğer değerler, "out" parametreleri gibi davranan işaretçi parametreler aracılığıyla "döndürülür" ve genellikle imza içinde son parametre olarak yer alır. C# ve Visual Basic gibi diller, hataların dilde genellikle nasıl yayıldığıyla uyumlu olacak şekilde bir hata kodunu genellikle bir özel duruma dönüştürür ve birlikte çalışma yöntemi imzalarının HRESULT içermemesini bekler. Metot imzasını yerel bir imzaya çevirmek için, çalışma zamanı metot dönüş değerini bir düzey daha dolaylı olarak kullanılan ek bir "out" parametresine taşır (başka bir deyişle, yönetilen imzanın dönüş tipine bir işaretçi haline getirir) ve HRESULT dönüş değeri olduğunu varsayar. Yönetilen yöntem döndürürse void, ek parametre eklenmez ve dönüş değeri olur HRESULT. Örneğin, aynı yerel imzaya çevrilen aşağıdaki iki C# COM yöntemine bakın:

int Add(int a, int b);

void Add(int a, int b, out int sum);
HRESULT Add(int a, int b, /* out */ int* sum);

COM'da PreserveSig

C# dilindeki tüm COM yöntemlerinin varsayılan olarak çevrilmiş imzayı kullanması beklenir. İmza çevirisini ve HRESULT değerlerinin işlenmesini içermeyen yöntemleri kullanmak ve dışarı aktarmak için PreserveSigAttribute öğesini bir COM Arabirimi Yöntemine ekleyin. Özniteliği bir yönteme uygulandığında, imzaya çeviri yapılmaz ve başarısız HRESULT değerler için özel durumlar atılmaz. Bu, hem yerleşik COM hem de kaynak tarafından oluşturulan COM için geçerlidir. Örneğin, özniteliği PreserveSig ve buna karşılık gelen yerel imzası olan aşağıdaki C# yöntemi imzasına bakın.

[PreserveSig]
int Add(int a, int b, out int sum);
HRESULT Add(int a, int b, int* sum);

Yöntem hata olmayan farklı HRESULT değerler döndürebiliyorsa ancak farklı şekilde işlenmesi gerekiyorsa bu yararlı olabilir. Örneğin, bir yöntem başarısız olmadığında ancak yalnızca kısmi sonuçlar döndürdüğünde ve S_FALSE tüm sonuçları döndürdüğünde bazı yöntemler değeri S_OK döndürebilir.

PreserveSig P/Invokes ile

DllImportAttribute özniteliği, bool PreserveSig alanına da sahiptir ve bu alan, PreserveSigAttribute ile benzer şekilde çalışır, ancak varsayılan olarak true ayarlıdır. Çalışma zamanının yönetilen imzayı çevirmesi ve döndürülen HRESULT değerini işlemesi gerektiğini belirtmek için PreserveSig içindeki false alanını DllImportAttribute olarak ayarlayın. Örneğin, aynı yerel yönteme yönelik iki P/Invoke'un aşağıdaki imzalarına bakın: biri PreserveSig olarak ayarlanmış ve diğeri varsayılan false değeri olarak bırakılmış.

[DllImport("shlwapi.dll", EntryPoint = "SHAutoComplete", ExactSpelling = true, PreserveSig = false)]
public static extern void SHAutoComplete(IntPtr hwndEdit, SHAutoCompleteFlags dwFlags);

[DllImport("shlwapi.dll", EntryPoint = "SHAutoComplete", ExactSpelling = true)]
public static extern int SHAutoCompleteHRESULT(IntPtr hwndEdit, SHAutoCompleteFlags dwFlags);

Uyarı

kaynak tarafından üretilen P/Invoke'lar, LibraryImportAttribute kullanan bir PreserveSig alanına sahip değildir. Oluşturulan kod her zaman yerel ve yönetilen imzanın aynı olduğunu varsayar. Daha fazla bilgi için bkz. Kaynak tarafından oluşturulan P/Invokes.

Değerleri el ile işleme HRESULT

Bir PreserveSig yöntemi çağırdığınızda ve bu yöntem bir HRESULT döndürdüğünde, ThrowExceptionForHR bir başarısızlık belirtiyorsa, ilgili özel durumu atmak için HRESULT yöntemini kullanabilirsiniz. Benzer şekilde, bir PreserveSig yöntemi uygularken, özel durum için karşılık gelen değeri göstermesi amacıyla GetHRForException yöntemini kullanarak HRESULT değerini döndürebilirsiniz.

HRESULTs'i yapı olarak hazırlama

Bir PreserveSig yöntemi kullanıldığında, int için HRESULT'un yönetilen tür olması beklenir. Ancak, dönüş türü olarak özel bir 4 baytlık yapı kullanmak, ile HRESULTçalışmayı basitleştirebilecek yardımcı yöntemler ve özellikler tanımlamanıza olanak tanır. Yerleşik veri düzenlemede bu otomatik olarak çalışır. Kaynak kodu oluşturulan marshaling'de int öğesinin yönetilen gösterimi olarak HRESULT yerine bir yapı kullanmak için, bağımsız değişken olarak MarshalAsAttribute ile Error özniteliğini ekleyin. Bu özniteliğin varlığı, HRESULT bitlerini yapı olarak yeniden yorumlar.

Ayrıca bakınız