CLR语言应该理解Unicode,例如我可以在C#中定义一个名为Δ(希腊三角洲)的函数。但是,当我在IL Asm中定义此类函数时,编译器会抱怨非ASCII符号。有没有解决这个问题的方法?
答案 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字符,这很不错:
让所有同事都讨厌你的好方法!
有关详细信息,请参阅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.Δ()
。