gpt4 book ai didi

C# 编译器错误还是正常的 COM 异常?

转载 作者:IT王子 更新时间:2023-10-29 04:51:12 28 4
gpt4 key购买 nike

C# 4,为了简化 COM 互操作,允许 COM 接口(interface)的调用者通过 ref 参数省略参数前面的 ref 关键字。

今天我很惊讶地看到这也适用于扩展 COM 接口(interface)的扩展方法。请参阅以下编译代码:

using System;
using System.Runtime.InteropServices;

[ComImport, Guid ("cb4ac859-0589-483e-934d-b27845d5fe74")]
interface IFoo {
}

static class Program {

public static void Bar (this IFoo self, ref Guid id)
{
id = Guid.NewGuid ();
}

static void Main ()
{
Foo (null);
}

static void Foo (IFoo o)
{
Guid g = Guid.NewGuid ();
Console.WriteLine (g);

// note that g is passed as is, and not as ref g
o.Bar (g);

Console.WriteLine (g);
}
}

我没有在规范中找到任何解释此行为的内容。

我的感觉是 COM 接口(interface)之外的代码,即使它是扩展 COM 接口(interface)的扩展方法,也应该遵循常规的 C# 规则,并强制使用 ref 关键字。因此,我提交了 bug on connect .并不是说我认为这会被修复,即使它被认为是一个错误,也已经有依赖于它的代码。

错误?不是错误?

最佳答案

我不认为这是一个错误;正如您所说,它看起来更像是“COM voodoo”。在幕后,C# 编译器发出一些实际上是正确的东西,如下所示:

private static void Foo(IFoo o)
{
...
Guid g = Guid.NewGuid();
Guid <>r__ComRefCallLocal0 = g;
Bar(o, ref <>r__ComRefCallLocal0);
...
}

C#其实充满了花样。如果您向 IFoo 添加一个方法,例如,

[ComImport, Guid("cb4ac859-0589-483e-934d-b27845d5fe74")]
interface IFoo
{
void Test([Optional] ref object test);
}

同样,您将能够在 C# 4 中声明:

static void Foo(IFoo o)
{
Guid g = Guid.NewGuid();
o.Test(g);
}

当然,这一切之所以有效,是因为 CSC.EXE 对 ComImport 属性了如指掌。这些新的魔术互操作技巧被添加到 C# 4.0 中,以便能够轻松地与现有的 COM 接口(interface)进行互操作。好吧,主要是针对 Microsoft Office 界面和方法,尤其是大量可怕的“引用缺失”参数:-)

我认为这在任何地方都没有完全指定。这就是 C# 4 规范的全部内容:

17.5 Attributes for Interoperation Note: This section is applicable only to the Microsoft .NET implementation of C#. 17.5.1 Interoperation with COM and Win32 components The .NET run-time provides a large number of attributes that enable C# programs to interoperate with components written using COM and Win32 DLLs. For example, the DllImport attribute can be used on a static extern method to indicate that the implementation of the method is to be found in a Win32 DLL. These attributes are found in the System.Runtime.InteropServices namespace, and detailed documentation for these attributes is found in the .NET runtime documentation.

这里是 MSDN 上的一些页面:

关于C# 编译器错误还是正常的 COM 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8930089/

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