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

xto*_*ofl 6 .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
}
Run Code Online (Sandbox Code Playgroud)

此代码的.NET对应物读取:

try {
   c.foo();
   // success code
} catch ( Exception e ) {
   // failure code
}
Run Code Online (Sandbox Code Playgroud)

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

Sve*_*ven 5

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

例如:

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

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

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