gpt4 book ai didi

c# - 什么时候需要/适合使用 InAttribute 和 OutAttribute 进行 COM Interop

转载 作者:可可西里 更新时间:2023-11-01 07:46:10 29 4
gpt4 key购买 nike

我正在尝试检查我们分散在各个项目中的困惑的 COM 互操作定义,并将它们收集到一个已知良好的位置,整个开发团队都可以从中受益。这项工作的一部分涉及清理多年来积累的定义。

其中一些是从其他源代码借用的,一些是从 pinvoke.net 逐字复制的,还有一些看起来是直接从 SDK header 翻译而来的。我注意到的一件事是,在何时使用各种编码属性方面没有一致性(即使在 pinvoke.net 示例中,这也是非常偶然的)。部分问题是,我不认为这里的任何人(包括我自己)完全理解何时需要或不需要各种属性,或者它们实际做什么。到目前为止,在 COMExceptions 停止发生之前,让这些正确似乎是猜测和随机更改的结合,但我更希望翻译是正确的,因为有人确实看过它们并这样声明。

所以,我从 [In][Out] 开始。我知道这两个属性在概念上的作用:它们通知编码器数据必须去往哪个方向。例如,我假设编码器不会费心将 [In] 数据复制回调用者,或者知道 [Out] 数据可能需要在被叫方等方面释放。我不知道的是:

  1. 什么时候需要使用这些属性?也就是说,默认编码行为何时出错,以至于属性使其正确?
  2. 什么时候使用这些属性安全?也就是说,指定默认行为是否会改变编码器的工作方式?
  3. 什么时候使用这些属性危险?我假设显式标记输出参数 [In] 是不好的,但是标记输入参数 [In, Out] 真的会破坏任何东西吗?

因此,给定一个假想的 COM 接口(interface)方法,其 IDL 如下所示:

HRESULT Foo(
[in] ULONG a,
[out] ULONG * b
[in, out] ULONG * c);

我可能会看到它被翻译成以下任何一种:

void Foo(
uint cb,
out uint b,
ref uint c);

void Foo(
uint cb,
[Out] out uint b,
[In, Out] ref uint c);

void Foo(
[In] uint cb,
[Out] out uint b,
[In, Out] ref uint c);

这三者在功能上有什么区别吗?除了技术正确性之外,是否还有其他原因被认为比其他“更好”?

最佳答案

不,在您自己的代码中应用这些属性中的任何一个都不是绝对必要的。它们都是可选的,并会根据参数的类型自动应用于您的代码。

本质上,它们具有以下 C# 关键字等效项:

  • 您默认获得 [In]
  • ref 关键字让您[In, Out]
  • out 关键字让您[Out]

所有记录在一个漂亮的表格中 here .

只有当你想改变那些隐含的语义或改变编码(marshal)拆收器的默认行为时,你才需要使用它们。例如,您可以使用 [In] 属性标记声明为 ref 的参数,以仅抑制编码(marshal)处理的“out”部分。

也就是说,我发现自己在使用它们,因为它们是制作代码自文档的一种非常简单的方法。

关于c# - 什么时候需要/适合使用 InAttribute 和 OutAttribute 进行 COM Interop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8593345/

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