您可以使用反射来做到这一点。
我使用 ILAsm 将以下内容编译成一个程序集(我删除了使其实际编译所需的所有绒毛;这些只是显着的位(双关语)):
.method private hidebysig static int32
'Te-st'() cil managed {
// Code size 8 (0x8)
.maxstack 1
.locals init ([0] int32 CS$1$0000)
IL_0000: nop
IL_0001: ldc.i4.s 0x11
IL_0002: stloc.0
IL_0003: br.s IL_0005
IL_0005: ldloc.0
IL_0006: ret
}
我在Program
名为Test
. 请注意,方法名称用单引号括起来。这是按照规范(ECMA #335):
标识符用于命名实体。简单标识符等同于 ID。但是,ILAsm 语法允许使用可以使用 Unicode 字符集形成的任何标识符(参见第 I 部分)。为此,标识符应放在单引号内。
然后:
var assembly = Assembly.LoadFrom(path);
var method = assembly.GetType("Test.Program")
.GetMethod(
"Te-st",
BindingFlags.Static | BindingFlags.NonPublic
);
Console.WriteLine(method.Invoke(null, null));
这产生了输出:
17
我怀疑这在通常的 .NET 语言中是否可行。我不知道任何允许/要求您“转义”标识符的语言。没有它,你能想象试图消除以下歧义:
int a;
int b;
int a-b;
int diff = a-b; // is that a minus b or the variable a-b?
也许有一个 COBOL.NET 你可以做到这一点,我不知道。