代码之家  ›  专栏  ›  技术社区  ›  user2341923

IL Asm函数名中的Unicode?

  •  2
  • user2341923  · 技术社区  · 12 年前

    CLR语言应该理解Unicode,例如,我可以在C#中定义一个名为(希腊语德尔塔)的函数。然而,当我在IL-Asm中定义这样的函数时,编译器会抱怨非ASCII符号。这个问题有什么解决办法吗?

    2 回复  |  直到 12 年前
        1
  •  3
  •   Mike Christensen    12 年前

    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 了解更多信息。

        2
  •  2
  •   svick Raja Nadar    12 年前

    您可以在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.Δ() .