(初步说明:我还没有完全掌握整个'互操作'的速度......)
在.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返回码,因此不需要处理异常处理?
答案 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);
如果您的界面非常复杂或者您不知道如何定义互操作界面,我建议使用tlbimp.exe,然后使用Reflector或ILSpy或类似的东西来反编译生成的界面,然后根据自己的喜好编辑它们。也节省了工作。 :)