(初步说明:我还没有完全跟上整个"互操作"的速度…)
在.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或类似的东西来反编译生成的接口,然后根据你的喜好编辑这些接口。也可以节省工作。:)