2009-12-24 2 views
0

В настоящее время я использую Mono Cecil для извлечения данных из проектов C#. Теперь мне нужно проверить, прочитано или записано поле в каждом методе.Как узнать из инструкции CIL, прочитано или записано поле?

Как можно определить из CIL instruction, что поле читается или записывается?

Cos Сомневаюсь, что библиотека в Mono Cecil похожа на Assignment в JDT Eclipse, которая позволяет мне извлекать левую сторону и правую сторону. Если есть, то я могу просто работать оттуда.

+0

Кстати, я бы посоветовал использовать эту спецификацию CLI из ECMA: http://www.google.com/url?q=http://www.ecma-international.org/publications/files/ECMA- ST/Ecma-335.pdf & ei = qxMzS_6SFpD-sQOA7JHBBA & sa = X & oi = nshc & resnum = 1 & ct = result & cd = 1 & ved = 0CAoQzgQoAA & usg = AFQjCNHVmOmltbTSIZzP5GDNTq_FFJMKIg - а не спецификация MS. Последний имеет некоторые детали реализации, но не имеет навигационного оглавления, что очень неудобно. Спецификация ECMA также является одиночным файлом для разделов I-III. –

+0

На самом деле у меня спецификация ECMA, но я думал, что мне нужны только разделы III. Поэтому я просто ищу URL-адрес с разделом III в качестве url для присоединения к этому qn. Вы имеете в виду, что мне нужно еще что-нибудь из другого раздела, кроме третьего, на какие другие разделы я должен искать? – yeeen

+0

Раздел III - набор команд CIL, но он сильно ссылается на разделы I и II (которые определяют базовые понятия, систему CLR и т. Д.). Ссылка, которую я дал ранее, для всех трех разделов. –

ответ

2

Инструкция для магазинов с прямым полем - stfld, поэтому вам придется искать это.

Обратите внимание, что поля также могут быть косвенно записаны через указатели (оба типа * и &), которые невозможно обнаружить в наиболее общем случае (поскольку указатель может поступать извне).

+0

Что вы подразумеваете под «как указатель может прийти извне»? Можете ли вы привести пример, thx? Я знаю несколько абзацев, но не знаком с этим. – yeeen

+0

Рассмотрите код C#: 'unsafe void Foo (int * p) {* p = 123; } '. Это можно назвать 'Foo (& x.y)' (если, например, 'x' является локальной' struct'). –

+0

Я узнал, что ldfld и stfld работают только для геттеров и сеттеров. Для других читать и хранить (кроме указателей), u hv использовать ldsfld и stsfld, я думаю. Я попробовал, например, у дал и получил ldflda, когда метод вызван. – yeeen