gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:15:12 26 4
gpt4 key购买 nike

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

在 .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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com