Как можно получить доступ к свойствам объекта в CIL (MSIL)?
-
19-08-2019 - |
Вопрос
Видите ли, я абсолютный новичок.Допустим, у меня есть объект string в стеке, и я хочу получить количество символов в нем - его свойство .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