これは、リフレクションを使用して行うことができます。
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 があるかもしれませんが、わかりません。