例如,在C#中使用out
关键字的方法中的参数将显示在元数据签名中,前面是&符号&
。我正在尝试为通用方法创建签名,但我不想使用元数据API来解决这个问题,当然它已在某处记录了吗?
这是我在Socket类上对BeginReceiveFrom的意思的一个例子:
System.IAsyncResult([]System.Byte,System.Int32,System.Int32,
System.Net.Sockets.SocketFlags,&System.Net.EndPoint,
System.AsyncCallback,System.Object)
答案 0 :(得分:5)
对于未构造的类型,有一个反引号后跟参数的数量,例如。
List`1
Dictionary`2
从ECMA 335,第10.7.2节:
10.7.2类型名称和arity编码
符合CLS的通用类型名称 使用格式编码 name ['arity],其中[...]表示 严重的重音字符
"'"
和arity一起是可选的。该 编码名称应遵循以下规则:
- name应为不包含“`”的ID(参见Partition II) 字符。
- arity指定为无前导零的无符号十进制数 或空格。
- 对于普通泛型类型,arity是声明的类型参数的数量 关于类型。
- 对于嵌套泛型类型,arity是新引入类型的数量 参数。
醇>
(请注意,由于降价,我无法在引号中使用反引号 - 因此是撇号!)
不确定构造的类型......
答案 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)