.net - COM `HRESULT` 被包装到 .NET 中的异常中

标签 .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
}

此代码的 .NET 对应内容如下:
try {
   c.foo();
   // success code
} catch ( Exception e ) {
   // failure code
}

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

最佳答案

可以,但您必须手动定义互操作接口(interface)(而不是使用 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 方法。

如果你的接口(interface)非常复杂或者你在如何定义互操作接口(interface)上遇到困难,我建议使用 tlbimp.exe,然后使用 Reflector 或 ILSpy 或类似的东西来反编译生成的接口(interface),然后根据自己的喜好进行编辑。也节省了工作量。 :)

关于.net - COM `HRESULT` 被包装到 .NET 中的异常中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6371117/

相关文章:

.net - 构建热插拔WCF服务库的最佳方式

c# - 混淆器之后的 CSharpCodeProvider

swift - 是否可以在不声明的情况下在 Swift 中抛出 "RuntimeException"?

c# - 通过 COM 为 C++ 客户端公开 C#

c# - Marshal.GenerateGuidForType(Type) 和 Type.GUID 之间有什么区别?

c# - 在 .NET 中逐个节点地比较两个 XML 文件

.net - 使用 Unity\T4\anything 进行面向方面的日志记录

exception - PowerShell 捕获类型异常

java - 输入不匹配异常

tdd - 模拟非虚拟事件(在 COM 互操作类中)