COM“HRESULT”在.NET中被包装成一个异常



(初步说明:我还没有完全跟上整个"互操作"的速度…)

在.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返回代码,这样就不需要异常处理了?

是的,但您必须手动定义interop接口(而不是使用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或类似的东西来反编译生成的接口,然后根据你的喜好编辑这些接口。也可以节省工作。:)

相关内容

  • 没有找到相关文章