.NET 2.0/C# 中泛型方法的元数据的签名格式是什么?

发布于 2024-07-25 21:22:48 字数 374 浏览 4 评论 0 原文

例如,在 C# 中使用 out 关键字的方法中的参数将显示在元数据签名中,前面带有与号 &。 我正在尝试为通用方法创建签名,但我不想使用元数据 API 来解决这个问题,它肯定记录在某处吗?

以下是 Socket 类上的 BeginReceiveFrom 含义的示例:

        System.IAsyncResult([]System.Byte,System.Int32,System.Int32,
    System.Net.Sockets.SocketFlags,&System.Net.EndPoint,
System.AsyncCallback,System.Object)

For instance, parameters in a method that use the out keyword in C# will show up in the metadata signature preceded by an ampersand &. I'm trying to create the signature for a generic method but I don't want to use the metadata APIs to figure this out, surely it's documented somewhere?

Here's an example of what I mean for BeginReceiveFrom on the Socket class:

        System.IAsyncResult([]System.Byte,System.Int32,System.Int32,
    System.Net.Sockets.SocketFlags,&System.Net.EndPoint,
System.AsyncCallback,System.Object)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

沧笙踏歌 2024-08-01 21:22:48

对于非构造类型,有一个反引号,后跟参数数量,例如

List`1
Dictionary`2

来自 ECMA 335,第 10.7.2 节:

10.7.2 类型名称和元数编码

符合 CLS 的泛型类型名称使用格式“name[`arity]” 进行编码,其中 [...] 表示重音字符“`”和 arity > 一起是可选的。 编码名称应遵循以下规则:

  1. 名称应为不包含“`”字符的ID(请参阅分区 II)。
  2. arity 指定为不带前导零或空格的无符号十进制数。
  3. 对于普通泛型类型,arity 是在该类型上声明的类型参数的数量。
  4. 对于嵌套泛型类型,arity 是新引入类型的数量
    参数。

不确定构造类型......

There's a backtick followed by the number of arguments, for the unconstructed type, e.g.

List`1
Dictionary`2

From ECMA 335, section 10.7.2:

10.7.2 Type names and arity encoding

CLS-compliant generic type names are encoded using the format “name[`arity]”, where […] indicates that the grave accent character “`” and arity together are optional. The encoded name shall follow these rules:

  1. name shall be an ID (see Partition II) that does not contain the “`” character.
  2. arity is specified as an unsigned decimal number without leading zeros or spaces.
  3. For a normal generic type, arity is the number of type parameters declared on the type.
  4. For a nested generic type, arity is the number of newly introduced type
    parameters.

Not sure about constructed types...

孤芳又自赏 2024-08-01 21:22:48

要声明泛型方法,您可以使用 !!T 来引用泛型参数:

.method public static void Method<T1, T2>(!!T1 arg1, !!T2 arg2) {
    // ...
}

或者您可以使用它们的编号:

.method public static void Method<T1, T2>(!!0 arg1, !!1 arg2)

并调用您提供实例化的泛型方法。 但是,实例化中引用的类型是关于调用的方法,而不是您调用它的位置:

ldc.i4.1
newobj instance void [mscorlib]System.Object::.ctor()

// !!0 and !!1 refer to the generic parameters of Method<T1, T2>,
// not any generic method this call instruction is part of
call void Method<int32, object>(!!0,!!1)

如果该方法是泛型类型的一部分,则可以使用指定类型实例化>!T 以类似的方式引用类型参数。 请注意,按照惯例,泛型类型在类型名称后有一个 `,后跟泛型参数的数量:

call instance void MyGenericType`1<int32>::Method(!0)

To declare a generic method you use !!T to refer to the generic parameters:

.method public static void Method<T1, T2>(!!T1 arg1, !!T2 arg2) {
    // ...
}

or you can use their number:

.method public static void Method<T1, T2>(!!0 arg1, !!1 arg2)

and to call a generic method you provide the instantiation. However, the types referred to in the instantiation are wrt the the called method, not where you're calling it from:

ldc.i4.1
newobj instance void [mscorlib]System.Object::.ctor()

// !!0 and !!1 refer to the generic parameters of Method<T1, T2>,
// not any generic method this call instruction is part of
call void Method<int32, object>(!!0,!!1)

If the method is part of a generic type, you specify the type instantiation using !T to refer to the type parameters in a similar fashion. Note that it is a convention that generic types have a ` after the type name, followed by the number of generic arguments:

call instance void MyGenericType`1<int32>::Method(!0)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文