Return IDL 中的值

Return value in IDL

I'm learning how to write C# from IDL 而我不明白的是为什么 return 值在参数列表中定义为 [out, retval]。常识告诉我 HRESULT 应该是 return 类型,但它似乎对 C# 中的代码没有任何影响。

COM 不支持异常。它们是非常强大的语言运行时实现细节,C# 异常与 C++ 异常完全不同。这使得 HRESULT 非常重要,它是替代品。每个 COM 方法都应该 return 一个错误代码,负值表示失败。

但是很多语言确实支持异常。允许语言运行时将失败的 HRESULT 转换为异常。因此不再需要 return 值。

允许类型库导入器和 CLR 重写方法签名。使它看起来像一个 "normal" 函数,具有有用的 return 值。 [retval] 属性表明了这一点。没有它就变成了一种正常的方法,return无效。

还解释了 [PreserveSig] 属性的相关性,它抑制了这种重写。当 HRESULT return 不只是 0 时偶尔需要,以指示成功。例如,COM 迭代器需要它用于 Next() method