2

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

4

2 回答 2

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 字符,这很好:

在此处输入图像描述

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

有关更多信息,请参阅规范

于 2013-10-11T21:45:20.790 回答
2

您可以在 IL(使用 ILAsm 编译)中编写包含 Unicode 字符的方法,并且可以从 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.Δ()

于 2013-10-11T22:54:22.657 回答