COM`HRESULT`被包装到.NET中的Exception中

时间:2011-06-16 11:31:46

标签: .net exception com-interop hresult

(初步说明:我还没有完全掌握整个'互操作'的速度......)

在.NET中使用COM库时,所有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
}

有没有办法直接在.NET中访问COM返回码,因此不需要处理异常处理?

1 个答案:

答案 0 :(得分:5)

是的,但您必须手动定义互操作界面(而不是使用tlbimp.exe)并使用相关方法的PreserveSig属性。

例如:

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

这相当于带有签名HRESULT DoSomething([out, retval] int *result);

的COM方法

如果您的界面非常复杂或者您不知道如何定义互操作界面,我建议使用tlbimp.exe,然后使用Reflector或ILSpy或类似的东西来反编译生成的界面,然后根据自己的喜好编辑它们。也节省了工作。 :)