2015-06-05 3 views
1

Я работаю над пользовательскими правилами FxCOP. Я работаю над тем, чтобы использовать строки инструкций IL. У меня есть основное сомнение, когда мы реализуем aC# -код, мы получаем коды операций, они в разных строках для каждой команды (Исходный код Инструкция имеет несколько кодов операций в одной строке)Пользовательские правила FxCOp

сейчас мой наставник просит меня рассчитать разные линии, в которых использовались несколько кодов операций. Однако я понимаю, что каждая инструкция IL находится в другой строке. Я буду стараться, чтобы показать разницу во мнениях следующим образом:

Исходный код

opcode 1, opcode 2, opcode 3 
opcode 4, opcode 5 

My Opinion     My Mentor's Opinion 

Opcode 1      Opcode 1,Opcode 2, Opcode 3 
Opcode 2      Opcode 5, Opcode 6 
opcode 3 

Я не смог найти, что верно. Пожалуйста, помогите мне найти, если для любого заданного кода C# инструкции IL находятся в отдельных строках, несмотря на то, что команда находится в одной строке для исходного кода, или если это то, что полагает мой наставник, и есть способ найти разные строки.

Благодаря

+0

Я не понимаю, что вы просите. Строка источника C# может быть представлена ​​0 ... n IL opcodes. Линия может быть удалена компилятором (так что 0 опкодов), или это может быть x opcodes – xanatos

+0

да, мы можем получить общее количество опкодов, согласованное. Но можем ли мы получить, сколько кодов операций используется в каждой строке исходного кода. Я думаю, мы не можем ... Но я хочу подтвердить. –

+0

У ИЛ нет «линий». Вам понадобится файл PDB для сопоставления кодов IL с исходными кодами. Самый простой способ - использовать опцию ildasm.exe/linenum. Помните, что вы тратите свое время на это, Roslyn - это будущее, и оно здесь сегодня. –

ответ

0

Вы можете написать что-то вроде:

public override ProblemCollection Check(Member member) 
{ 
    Method method = member as Method; 

    if (method == null) 
    { 
     return base.Check(member); 
    } 

    Console.WriteLine("Method: {0}", member.Name); 

    InstructionCollection ops = method.Instructions; 

    foreach (Instruction op in ops) 
    { 
     Console.WriteLine("File: {0}, Line: {1}, Pos: {2}, OpCode: {3}", op.SourceContext.FileName, op.SourceContext.StartLine, op.SourceContext.StartColumn, op.OpCode); 
    } 

    Console.WriteLine(); 

    return base.Problems; 
} 

Обратите внимание, что в режиме выпуска связь между строкой кода и Opcodes немного «случайным», потому что C# компилятор может изменить немного код. В режиме отладки отношения намного яснее.

Примечание (2), что я рассматриваю только StartLine и StartColumn. Есть EndLine и EndColumn объектов недвижимости.

+0

Свойства конечной линии и конца столбца используются аналогичным образом? –

+0

@shivangikulshrestha Да. Это цифры. Я не тестировал, как они работают с блочными инструкциями типа 'if (...) {... некоторые строки ...} else {... некоторые другие строки}' – xanatos

+0

спасибо xanatos, позвольте мне вернуться к вам однажды Я его реализую. –

Смежные вопросы