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