本文整理汇总了C#中Mono.Cecil.Cil.CilWorker.InsertBefore方法的典型用法代码示例。如果您正苦于以下问题:C# CilWorker.InsertBefore方法的具体用法?C# CilWorker.InsertBefore怎么用?C# CilWorker.InsertBefore使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Mono.Cecil.Cil.CilWorker
的用法示例。
在下文中一共展示了CilWorker.InsertBefore方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: InsertCustomCodeCall
private static void InsertCustomCodeCall(
MethodDefinition method,
MethodReference generatedTypeCtorRef,
MethodReference generatedMethodRef,
CilWorker cilWorker,
Instruction instructionToInsertBefore,
bool replaceMethod
)
{
bool hasReturnValue = (method.ReturnType.ReturnType.FullName != typeof(void).FullName);
Instruction nop = cilWorker.Create(OpCodes.Nop);
cilWorker.InsertBefore(instructionToInsertBefore, nop);
// call ctor
Instruction newGeneratedType = cilWorker.Create(OpCodes.Newobj, generatedTypeCtorRef);
cilWorker.InsertBefore(instructionToInsertBefore, newGeneratedType);
// load arguments on stack if any
for (int i = 0; i < method.Parameters.Count; i++)
{
Instruction loadArg = cilWorker.Create(OpCodes.Ldarga_S, method.Parameters[i]);
cilWorker.InsertBefore(instructionToInsertBefore, loadArg);
}
// call replacing method
Instruction callGeneratedMethod = cilWorker.Create(OpCodes.Call, generatedMethodRef);
cilWorker.InsertBefore(instructionToInsertBefore, callGeneratedMethod);
if (hasReturnValue)
{
if (replaceMethod)
{
// add variable to list
var generatedValueVar = new VariableDefinition(method.ReturnType.ReturnType);
method.Body.Variables.Add(generatedValueVar);
// assign to variable
Instruction assignNewGeneratedValue = cilWorker.Create(OpCodes.Stloc, generatedValueVar);
cilWorker.InsertBefore(instructionToInsertBefore, assignNewGeneratedValue);
Instruction ldLoc = cilWorker.Create(OpCodes.Ldloc_0);
Instruction brs = cilWorker.Create(OpCodes.Br_S, ldLoc);
cilWorker.InsertBefore(instructionToInsertBefore, brs);
cilWorker.InsertBefore(instructionToInsertBefore, ldLoc);
}
else
{
// remove value from stack
Instruction pop = cilWorker.Create(OpCodes.Pop);
cilWorker.InsertBefore(instructionToInsertBefore, pop);
}
}
}
示例2: EnteringMethodInstruction
private void EnteringMethodInstruction(MethodDefinition method, CilWorker worker)
{
MethodReference enteringMethod =
method.DeclaringType.Module.Import(typeof (Profiler).GetMethod("EnteringMethod"));
worker.InsertBefore(method.Body.Instructions[0], worker.Create(OpCodes.Call, enteringMethod));
worker.InsertBefore(method.Body.Instructions[0],
worker.Create(OpCodes.Ldstr, MethodName(method)));
}