6

(初步说明:我还没有完全掌握整个“互操作”的东西......)

在 .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 返回代码,从而不需要异常处理?

4

1 回答 1

5

是的,但您必须手动定义互操作接口(而不是使用 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 或类似的东西来反编译生成的接口,然后根据自己的喜好进行编辑。也节省了工作量。:)

于 2011-06-16T11:47:06.860 回答