本文整理匯總了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)));
}