IL Asm函数名称中的Unicode?

时间:2013-10-11 21:36:20

标签: c# .net unicode clr il

CLR语言应该理解Unicode,例如我可以在C#中定义一个名为Δ(希腊三角洲)的函数。但是,当我在IL Asm中定义此类函数时,编译器会抱怨非ASCII符号。有没有解决这个问题的方法?

2 个答案:

答案 0 :(得分:3)

IL中的方法名称需要在单引号中。例如,代码:

class Class1
{
   public void \u0394() // Greek Delta
   {
      return;
   }
}

...将编译成:

.method public hidebysig instance void  'Δ'() cil managed
{
  // Code size       4 (0x4)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  br.s       IL_0003
  IL_0003:  ret
} // end of method Class1::'Δ'

请注意上面IL中方法名称周围的单引号

幸运的是,Visual Studio非常智能,可以显示实际的Unicode字符,这很不错:

enter image description here

让所有同事都讨厌你的好方法!

有关详细信息,请参阅Spec

答案 1 :(得分:2)

您可以在IL中编写包含Unicode字符的方法(使用ILAsm编译),并且可以从C#调用这些方法。

首先,语法来自CLI规范的§I.5.3:

  

标识符用于命名实体。简单标识符等同于   ID。但是,ILAsm语法允许使用可以使用Unicode字符集形成的任何标识符。为实现此目的,标识符应放在单引号内。

这意味着以下IL工作:

.assembly test {}
.assembly extern mscorlib {}

.class public Delta
{
  .method public static void 'Δ'()
  {
      .entrypoint
      ldstr "Hello, delta!"
      call void [mscorlib]System.Console::WriteLine(string)
      ret
  }
}

重要的一点是,文件必须保存为UTF-16,否则其他程序(包括C#编译器)将无法正确识别名称。

使用此功能,您可以完全按照C#所期望的方式调用该方法:Delta.Δ()