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

时间:2009-07-01 20:31:53

标签: c# .net clr cil

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

这是我在Socket类上对BeginReceiveFrom的意思的一个例子:

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

2 个答案:

答案 0 :(得分:5)

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

List`1
Dictionary`2

从ECMA 335,第10.7.2节:

  

10.7.2类型名称和arity编码

     

符合CLS的通用类型名称   使用格式编码   name ['arity],其中[...]表示   严重的重音字符"'"   和arity一起是可选的。该   编码名称应遵循以下规则:

     
      
  1. name应为不包含“`”的ID(参见Partition II)   字符。
  2.   
  3. arity指定为无前导零的无符号十进制数   或空格。
  4.   
  5. 对于普通泛型类型,arity是声明的类型参数的数量   关于类型。
  6.   
  7. 对于嵌套泛型类型,arity是新引入类型的数量   参数。
  8.   

(请注意,由于降价,我无法在引号中使用反引号 - 因此是撇号!)

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

答案 1 :(得分:1)

要声明通用方法,请使用!!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)