本文整理汇总了C#中Mono.Cecil.Cil.Instruction.ToString方法的典型用法代码示例。如果您正苦于以下问题:C# Instruction.ToString方法的具体用法?C# Instruction.ToString怎么用?C# Instruction.ToString使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Mono.Cecil.Cil.Instruction
的用法示例。
在下文中一共展示了Instruction.ToString方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: InstructionToString
private string InstructionToString(Instruction i)
{
return i.ToString().Split(new[] {": "}, 2, StringSplitOptions.None)[1];
}
示例2: Instrument
private static void Instrument (
AssemblyDefinition assembly,
TypeDefinition type,
Instruction instruction,
MethodReference countReference,
MethodDefinition method,
ILProcessor worker,
string lastLine,
InstrumentConfig config,
TextWriter writer,
ref int instrumentIndex)
{
//if the previous instruction is a Prefix instruction then this instruction MUST go with it.
//we cannot put an instruction between the two.
if (instruction.Previous != null && instruction.Previous.OpCode.OpCodeType == OpCodeType.Prefix)
return;
if (config.HasOffset (method.FullName, instruction.Offset))
return;
if (lastLine != null && config.HasLine (method.FullName, lastLine)) {
return;
}
var lineNumStart = -1;
var lineNumEnd = -1;
if (instruction.SequencePoint != null) {
lineNumStart = instruction.SequencePoint.StartLine;
lineNumEnd = instruction.SequencePoint.EndLine;
}
var parentTypeRef = type;
while (parentTypeRef.DeclaringType != null)
parentTypeRef = parentTypeRef.DeclaringType;
var line = string.Join ("\t",
assembly.Name, //0
parentTypeRef.FullName,//1
method.FullName, //2
lineNumStart, //3
lineNumEnd, //4
instruction.Offset, //5
instruction.ToString ().Replace ("\n", " "), //6
instruction.SequencePoint?.Document.Url); //7
writer.WriteLine (line);
var pathParamLoadInstruction = worker.Create (OpCodes.Ldstr, config.HitsPathPrefix);
var lineParamLoadInstruction = worker.Create (OpCodes.Ldc_I4, instrumentIndex);
var registerInstruction = worker.Create (OpCodes.Call, countReference);
//inserting method before instruction because after will not happen after a method Ret instruction
worker.InsertBefore (instruction, pathParamLoadInstruction);
worker.InsertAfter (pathParamLoadInstruction, lineParamLoadInstruction);
worker.InsertAfter (lineParamLoadInstruction, registerInstruction);
++instrumentIndex;
//change try/finally etc to point to our first instruction if they referenced the one we inserted before
foreach (var handler in method.Body.ExceptionHandlers) {
if (handler.FilterStart == instruction)
handler.FilterStart = pathParamLoadInstruction;
if (handler.TryStart == instruction)
handler.TryStart = pathParamLoadInstruction;
if (handler.TryEnd == instruction)
handler.TryEnd = pathParamLoadInstruction;
if (handler.HandlerStart == instruction)
handler.HandlerStart = pathParamLoadInstruction;
if (handler.HandlerEnd == instruction)
handler.HandlerEnd = pathParamLoadInstruction;
}
//change instructions with a target instruction if they referenced the one we inserted before to be our first instruction
foreach (var iteratedInstruction in method.Body.Instructions) {
var operand = iteratedInstruction.Operand;
if (operand == instruction) {
iteratedInstruction.Operand = pathParamLoadInstruction;
continue;
}
if (!(operand is Instruction []))
continue;
var operands = (Instruction [])operand;
for (var i = 0; i < operands.Length; ++i) {
if (operands [i] == instruction)
operands [i] = pathParamLoadInstruction;
}
}
}
示例3: CreateInstructionRecord
/// <summary>
/// Create an Instruction record in the database
/// </summary>
/// <param name="command">Command factory object</param>
/// <param name="instruction">Instruction</param>
private void CreateInstructionRecord(CommandFactory command, Instruction instruction)
{
command.Insert<InstructionField>(
command.GetLastId<AssemblyField>(),
command.GetLastId<ModuleField>(),
command.GetLastId<TypeField>(),
command.GetLastId<MethodField>(),
instruction.ToString()
);
}