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 или что-то подобное для декомпиляции сгенерированных интерфейсов, а затем отредактируйте их по своему вкусу. Сохраняет работу тоже.:)