CIL(MSIL)のオブジェクトプロパティにどのようにアクセスしますか?
-
19-08-2019 - |
質問
私は絶対的な初心者です。スタック上に文字列オブジェクトがあり、その中の文字数-その.Lengthプロパティを取得したいとします。どのようにしてint32番号を内部に隠しますか?
事前に感謝します!
解決
ILにはプロパティのようなものは実際にはありません。フィールドとメソッドのみがあります。 C#プロパティ構造は、コンパイラによってget_PropertyName
およびset_PropertyName
メソッドに変換されるため、これらのメソッドを呼び出してプロパティにアクセスする必要があります。
コードのサンプル(デバッグ)IL
var s = "hello world";
var i = s.Length;
IL
.locals init ([0] string s,
[1] int32 i)
IL_0000: nop
IL_0001: ldstr "hello world"
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: callvirt instance int32 [mscorlib]System.String::get_Length()
IL_000d: stloc.1
ご覧のとおり、Lengthプロパティはget_Length
への呼び出しを介してアクセスされます。
他のヒント
私はごまかしました...次のC#コードを取得し、ildasm / Reflectorで調べました
static void Main(string[] args)
{
string h = "hello world";
int i = h.Length;
}
は
と同等です.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 1
.locals init (
[0] string h,
[1] int32 i)
L_0000: nop
L_0001: ldstr "hello world"
L_0006: stloc.0
L_0007: ldloc.0
L_0008: callvirt instance int32 [mscorlib]System.String::get_Length()
L_000d: stloc.1
L_000e: ret
}
所属していません StackOverflow