COM `HRESULT` обернут в исключение в.NET

(предварительное примечание: я еще не совсем в курсе всего, что связано с "взаимодействием"...)

При использовании библиотеки COM из.NET все HRESULT методы заключаются во что-то, что выдает, когда код возврата НЕ УДАЛЕН.

//ATL magic exluded
class C {
    HRESULT foo(){ return E_FAIL; }
};

// usage code:
if( SUCCEEDED( c.foo() ) ) {
   // success code
} else {
   // failure code
}

.NET-аналог этого кода гласит:

try {
   c.foo();
   // success code
} catch ( Exception e ) {
   // failure code
}

Есть ли способ получить доступ к коду возврата COM непосредственно в.NET, чтобы не требовалась обработка исключений?

1 ответ

Решение

Да, но вам придется вручную определить интерфейс взаимодействия (а не использовать tlbimp.exe) и использовать атрибут PreserveSig в рассматриваемых методах.

Например:

[ComImport]
[Guid("your-guid-here")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IMyComInterface
{
     [PreserveSig]
     int DoSomething(out int result);
}

Это эквивалент COM-метода с подписью HRESULT DoSomething([out, retval] int *result);

Если ваш интерфейс очень сложный или вы застряли на том, как определить интерфейс взаимодействия, я рекомендую использовать tlbimp.exe, затем использовать Reflector или ILSpy или что-то подобное для декомпиляции сгенерированных интерфейсов, а затем отредактируйте их по своему вкусу. Сохраняет работу тоже.:)

Другие вопросы по тегам