Aracılığıyla paylaş


.NET birlikte çalışmasında ö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 parametreleri aracılığıyla "döndürülür" ve genellikle imzadaki son parametredir. C# ve Visual Basic gibi diller, hataların genellikle dilde yayılma biçimiyle eşleşecek şekilde geleneksel olarak bir hata kodunu özel duruma çevirir ve birlikte çalışma yöntemi imzalarının öğesini içermemesini HRESULTbekler. Yöntem imzasını yerel imzaya çevirmek için çalışma zamanı, yöntemin dönüş değerini bir dizin düzeyi daha içeren ek bir "out" parametresine taşır (başka bir deyişle, yönetilen imzanın dönüş türüne yönelik bir işaretçi yapar) ve bir 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 çevirisi ve değerleri işleme HRESULT olmadan yöntemleri kullanmak ve dışarı aktarmak için, com arabirimi yöntemine ekleyin PreserveSigAttribute . Özniteliği bir yönteme uygulandığında, imzaya çeviri yapılmaz ve başarısız HRESULT değerler için özel durumlar atılır. 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_OK tüm sonuçları döndürdüğünde bazı yöntemler değeri S_FALSE döndürebilir.

PreserveSig P/Invokes ile

özniteliği, DllImportAttribute ile benzer şekilde çalışan ancak varsayılan trueolarak PreserveSigAttributeolarak ayarlı olan alanına da sahiptirbool PreserveSig. Çalışma zamanının yönetilen imzayı çevirmesi ve döndürülen imzayı işlemesi HRESULT gerektiğini belirtmek için alanını içinde DllImportAttributeolarak false ayarlayınPreserveSig. Örneğin, biri olarak ayarlanmış falseve biri PreserveSig varsayılan true değere bırakılmış olmak üzere aynı yerel yönteme yönelik iki P/Invoke'un aşağıdaki imzalarına bakın.

[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);

Not

kaynak tarafından oluşturulan P/Invokes, kullanan LibraryImportAttributealanı yoktur PreserveSig . 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

döndüren bir PreserveSig yöntemi çağırırken, hata gösteriyorsa HRESULT ilgili özel durumu oluşturmak için yöntemini kullanabilirsinizThrowExceptionForHR.HRESULT Benzer şekilde, bir PreserveSig yöntem uygularken yöntemini kullanarak GetHRForException özel durum için karşılık gelen değeri gösteren değerini döndürebilirsiniz HRESULT .

HRESULTs'i yapı olarak hazırlama

Bir PreserveSig yöntem kullanılırken, int için HRESULTyö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 sıralamada bu otomatik olarak çalışır. Kaynak tarafından oluşturulan sıralamada öğesinin int yönetilen gösterimi HRESULT olarak yerine bir yapı kullanmak için özniteliğini Error bağımsız değişken olarak ekleyinMarshalAsAttribute. Bu özniteliğin varlığı, yapısı olarak bitlerini HRESULT yeniden yorumlar.

Ayrıca bkz.