本文整理汇总了C#中Mono.Cecil.Cil.CilWorker类的典型用法代码示例。如果您正苦于以下问题:C# CilWorker类的具体用法?C# CilWorker怎么用?C# CilWorker使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
CilWorker类属于Mono.Cecil.Cil命名空间,在下文中一共展示了CilWorker类的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C#代码示例。
示例1: MethodBodyRewriterParameters
/// <summary>
/// Initializes a new instance of the <see cref="MethodBodyRewriterParameters"/> class.
/// </summary>
/// <param name="IL">The CilWorker that is responsible for the current method body.</param>
/// <param name="oldInstructions">The value indicating the list of old instructions in the current method body.</param>
/// <param name="interceptionDisabled">The value that determines whether or not interception is disabled.</param>
/// <param name="invocationInfo">The local variable that will store the <see cref="IInvocationInfo"/> instance.</param>
/// <param name="returnValue">The value indicating the local variable that will store the return value.</param>
/// <param name="methodReplacementProvider">The <see cref="IMethodReplacementProvider"/> instance.</param>
/// <param name="aroundInvokeProvider">The <see cref="IAroundInvokeProvider"/> instance.</param>
/// <param name="classMethodReplacementProvider">The class-level<see cref="IMethodReplacementProvider"/> instance.</param>
/// <param name="getMethodReplacementProviderMethod">The functor that resolves the GetMethodReplacementProvider method.</param>
/// <param name="registryType">The interception registry type that will be responsible for handling class-level interception events.</param>
public MethodBodyRewriterParameters(CilWorker IL, IEnumerable<Instruction> oldInstructions,
VariableDefinition interceptionDisabled,
VariableDefinition invocationInfo,
VariableDefinition returnValue,
VariableDefinition methodReplacementProvider,
VariableDefinition aroundInvokeProvider,
VariableDefinition classMethodReplacementProvider,
Func<ModuleDefinition, MethodReference> getMethodReplacementProviderMethod,
Type registryType)
{
if (methodReplacementProvider.VariableType.FullName != typeof(IMethodReplacementProvider).FullName)
throw new ArgumentException("methodReplacementProvider");
if (aroundInvokeProvider.VariableType.FullName != typeof(IAroundInvokeProvider).FullName)
throw new ArgumentException("aroundInvokeProvider");
_cilWorker = IL;
_oldInstructions = oldInstructions;
_interceptionDisabled = interceptionDisabled;
_invocationInfo = invocationInfo;
_returnValue = returnValue;
_methodReplacementProvider = methodReplacementProvider;
_aroundInvokeProvider = aroundInvokeProvider;
_classMethodReplacementProvider = classMethodReplacementProvider;
_getMethodReplacementProviderMethod = getMethodReplacementProviderMethod;
_registryType = registryType;
}
开发者ID:svgorbunov,项目名称:ScrollsModLoader,代码行数:40,代码来源:MethodBodyRewriterParameters.cs
示例2: Emit
public void Emit(CilWorker IL)
{
var module = IL.GetModule();
var modifiableType = module.ImportType<IModifiableType>();
var getInterceptionDisabledMethod = module.ImportMethod<IModifiableType>("get_IsInterceptionDisabled");
if (!_hostMethod.HasThis)
{
IL.Emit(OpCodes.Ldc_I4_0);
IL.Emit(OpCodes.Stloc, _interceptionDisabled);
return;
}
var skipLabel = IL.Create(OpCodes.Nop);
// var interceptionDisabled = this.IsInterceptionDisabled;
IL.Emit(OpCodes.Ldarg_0);
IL.Emit(OpCodes.Isinst, modifiableType);
IL.Emit(OpCodes.Brfalse, skipLabel);
IL.Emit(OpCodes.Ldarg_0);
IL.Emit(OpCodes.Isinst, modifiableType);
IL.Emit(OpCodes.Callvirt, getInterceptionDisabledMethod);
IL.Emit(OpCodes.Stloc, _interceptionDisabled);
IL.Append(skipLabel);
}
开发者ID:zxl359592450,项目名称:linfu,代码行数:26,代码来源:GetInterceptionDisabled.cs
示例3: Rewrite
/// <summary>
/// Rewrites a target method using the given CilWorker.
/// </summary>
/// <param name="method">The target method.</param>
/// <param name="IL">The CilWorker that will be used to rewrite the target method.</param>
/// <param name="oldInstructions">The original instructions from the target method body.</param>
public void Rewrite(MethodDefinition method, CilWorker IL, IEnumerable<Instruction> oldInstructions)
{
var declaringType = method.DeclaringType;
var module = declaringType.Module;
// Interfaces and Enums cannot be modified
if (declaringType.IsInterface || declaringType.IsEnum)
return;
ImportReferences(module);
AddLocals(method);
if (!_modifiedTypes.Contains(declaringType))
{
AddAdditionalMembers(declaringType);
_modifiedTypes.Add(declaringType);
}
var newInstructions = new Queue<Instruction>();
foreach (var instruction in oldInstructions)
{
// Intercept only the load field and the load static field instruction
if (!ShouldReplace(instruction, method))
{
IL.Append(instruction);
continue;
}
Replace(instruction, method, IL);
}
}
开发者ID:jam231,项目名称:LinFu,代码行数:38,代码来源:MethodRewriter.cs
示例4: Rewrite
/// <summary>
/// Rewrites a target method using the given CilWorker.
/// </summary>
/// <param name="method">The target method.</param>
/// <param name="IL">The CilWorker that will be used to rewrite the target method.</param>
/// <param name="oldInstructions">The original instructions from the target method body.</param>
public void Rewrite(MethodDefinition method, CilWorker IL, IEnumerable<Instruction> oldInstructions)
{
if (!ShouldRewrite(method))
return;
var declaringType = method.DeclaringType;
var body = IL.GetBody();
body.InitLocals = true;
var module = declaringType.Module;
// Interfaces and Enums cannot be modified
if (declaringType.IsInterface || declaringType.IsEnum)
return;
ImportReferences(module);
AddLocals(method);
if (!_modifiedTypes.Contains(declaringType))
{
AddAdditionalMembers(declaringType);
_modifiedTypes.Add(declaringType);
}
RewriteMethodBody(method, IL, oldInstructions);
}
开发者ID:slieser,项目名称:LinFu,代码行数:34,代码来源:BaseMethodRewriter.cs
示例5: Emit
/// <summary>
/// Adds the original instructions to a given method body.
/// </summary>
/// <param name="IL">The <see cref="CilWorker"/> responsible for the target method body.</param>
public void Emit(CilWorker IL)
{
var originalInstructions = new List<Instruction>(_oldInstructions);
Instruction lastInstruction = originalInstructions.LastOrDefault();
if (lastInstruction != null && lastInstruction.OpCode == OpCodes.Ret)
{
// HACK: Convert the Ret instruction into a Nop
// instruction so that the code will
// fall through to the epilog
lastInstruction.OpCode = OpCodes.Br;
lastInstruction.Operand = _endLabel;
}
foreach (Instruction instruction in (IEnumerable<Instruction>) originalInstructions)
{
if (instruction.OpCode != OpCodes.Ret || instruction == lastInstruction)
continue;
if (lastInstruction == null)
continue;
// HACK: Modify all ret instructions to call
// the epilog after execution
instruction.OpCode = OpCodes.Br;
instruction.Operand = lastInstruction;
}
// Emit the original instructions
foreach (Instruction instruction in originalInstructions)
{
IL.Append(instruction);
}
}
开发者ID:svgorbunov,项目名称:ScrollsModLoader,代码行数:38,代码来源:AddOriginalInstructions.cs
示例6: RewriteMethodBody
/// <summary>
/// Rewrites the instructions in the target method body.
/// </summary>
/// <param name="method">The target method.</param>
/// <param name="IL">The <see cref="CilWorker"/> instance that represents the method body.</param>
/// <param name="oldInstructions">The IL instructions of the original method body.</param>
protected override void RewriteMethodBody(MethodDefinition method, CilWorker IL,
IEnumerable<Instruction> oldInstructions)
{
if (IsExcluded(method))
{
AddOriginalInstructions(IL, oldInstructions);
return;
}
VariableDefinition interceptionDisabled = method.AddLocal<bool>();
VariableDefinition invocationInfo = method.AddLocal<IInvocationInfo>();
VariableDefinition aroundInvokeProvider = method.AddLocal<IAroundInvokeProvider>();
VariableDefinition methodReplacementProvider = method.AddLocal<IMethodReplacementProvider>();
VariableDefinition returnValue = method.AddLocal<object>();
VariableDefinition classMethodReplacementProvider = method.AddLocal<IMethodReplacementProvider>();
Func<ModuleDefinition, MethodReference> getInstanceMethodReplacementProviderMethod =
module => module.Import(typeof (IMethodReplacementHost).GetMethod("get_MethodBodyReplacementProvider"));
var parameters = new MethodBodyRewriterParameters(IL,
oldInstructions,
interceptionDisabled,
invocationInfo, returnValue,
aroundInvokeProvider,
methodReplacementProvider,
classMethodReplacementProvider,
getInstanceMethodReplacementProviderMethod,
typeof (AroundMethodBodyRegistry));
var emitter = new InvocationInfoEmitter(true);
IInstructionEmitter getMethodReplacementProvider =
new GetMethodReplacementProvider(methodReplacementProvider, method,
getInstanceMethodReplacementProviderMethod);
IInstructionEmitter getInterceptionDisabled = new GetInterceptionDisabled(parameters);
ISurroundMethodBody surroundMethodBody = new SurroundMethodBody(parameters, "AroundMethodBodyProvider");
IInstructionEmitter getClassMethodReplacementProvider = new GetClassMethodReplacementProvider(parameters,
module =>
module.Import(
typeof (
MethodBodyReplacementProviderRegistry
).
GetMethod
("GetProvider")));
IInstructionEmitter addMethodReplacement = new AddMethodReplacementImplementation(parameters);
var rewriter = new InterceptAndSurroundMethodBody(emitter, getInterceptionDisabled, surroundMethodBody,
getMethodReplacementProvider,
getClassMethodReplacementProvider, addMethodReplacement,
parameters);
// Determine whether or not the method should be intercepted
rewriter.Rewrite(method, IL, oldInstructions);
}
开发者ID:kpaba,项目名称:kpaba,代码行数:62,代码来源:InterceptMethodBody.cs
示例7: Emit
/// <summary>
/// Emits the call to the <see cref="IAfterInvoke"/> instance.
/// </summary>
/// <param name="IL">The <see cref="CilWorker"/> that points to the current method body.</param>
public void Emit(CilWorker IL)
{
ModuleDefinition module = IL.GetModule();
// instanceAroundInvoke.AfterInvoke(info, returnValue);
Emit(IL, module, _surroundingImplementation, _invocationInfo, _returnValue);
// classAroundInvoke.AfterInvoke(info, returnValue);
Emit(IL, module, _surroundingClassImplementation, _invocationInfo, _returnValue);
}
开发者ID:svgorbunov,项目名称:ScrollsModLoader,代码行数:14,代码来源:EmitAfterInvoke.cs
示例8: Emit
/// <summary>
/// Emits the instructions that obtain the <see cref="IAroundInvoke"/> instance.
/// </summary>
/// <param name="IL">The <see cref="CilWorker"/> that points to the current method body.</param>
public void Emit(CilWorker IL)
{
MethodDefinition method = IL.GetMethod();
TypeDefinition declaringType = method.DeclaringType;
ModuleDefinition module = declaringType.Module;
MethodReference getSurroundingImplementation = module.Import(_getSurroundingImplementationMethod);
IL.Emit(OpCodes.Ldloc, _invocationInfo);
IL.Emit(OpCodes.Call, getSurroundingImplementation);
IL.Emit(OpCodes.Stloc, _surroundingClassImplementation);
}
开发者ID:svgorbunov,项目名称:ScrollsModLoader,代码行数:15,代码来源:GetSurroundingClassImplementation.cs
示例9: Emit
/// <summary>
/// Emits the instructions that obtain the <see cref="IAroundInvoke"/> instance.
/// </summary>
/// <param name="IL">The <see cref="CilWorker"/> that points to the current method body.</param>
public void Emit(CilWorker IL)
{
var method = IL.GetMethod();
var declaringType = method.DeclaringType;
var module = declaringType.Module;
var getSurroundingImplementation = module.Import(_getSurroundingImplementationMethod);
IL.Emit(OpCodes.Ldloc, _invocationInfo);
IL.Emit(OpCodes.Call, getSurroundingImplementation);
IL.Emit(OpCodes.Stloc, _surroundingClassImplementation);
}
开发者ID:philiplaureano,项目名称:LinFu,代码行数:15,代码来源:GetSurroundingClassImplementation.cs
示例10: Emit
/// <summary>
/// Saves the return value from a given method call.
/// </summary>
/// <param name="IL">The <see cref="CilWorker"/> pointing to the target method body.</param>
public void Emit(CilWorker IL)
{
ModuleDefinition module = IL.GetModule();
TypeReference voidType = module.ImportType(typeof (void));
bool returnTypeIsValueType = _returnType != voidType && _returnType.IsValueType;
if (_returnType is GenericParameter || returnTypeIsValueType)
IL.Create(OpCodes.Box, _returnType);
if (_returnType != voidType)
IL.Create(OpCodes.Stloc, _returnValue);
}
开发者ID:svgorbunov,项目名称:ScrollsModLoader,代码行数:16,代码来源:SaveReturnValue.cs
示例11: Emit
/// <summary>
/// Saves the return value from a given method call.
/// </summary>
/// <param name="IL">The <see cref="CilWorker"/> pointing to the target method body.</param>
public void Emit(CilWorker IL)
{
var module = IL.GetModule();
var voidType = module.ImportType(typeof (void));
var returnTypeIsValueType = _returnType != voidType && _returnType.IsValueType;
if (_returnType is GenericParameter || returnTypeIsValueType)
IL.Create(OpCodes.Box, _returnType);
if (_returnType != voidType)
IL.Create(OpCodes.Stloc, _returnValue);
}
开发者ID:philiplaureano,项目名称:LinFu,代码行数:16,代码来源:SaveReturnValue.cs
示例12: ParameterContext
public ParameterContext(CilWorker worker, TypeReference interfaceType, MethodReference currentMethod, VariableDefinition currentArguments, VariableDefinition currentArgument, TypeReference targetDependency, MethodDefinition adapterConstructor, ParameterReference param)
{
CilWorker = worker;
CurrentArguments = currentArguments;
CurrentArgument = currentArgument;
TargetDependency = targetDependency;
Parameter = param;
InterfaceType = interfaceType;
AdapterConstructor = adapterConstructor;
CurrentMethod = currentMethod;
}
开发者ID:philiplaureano,项目名称:Taiji,代码行数:12,代码来源:ParameterContext.cs
示例13: EmitNewObject
public void EmitNewObject(MethodDefinition hostMethod, CilWorker IL, MethodReference targetConstructor,
TypeReference concreteType)
{
ParameterDefinitionCollection parameters = targetConstructor.Parameters;
Instruction skipInterception = IL.Create(OpCodes.Nop);
SaveConstructorArguments(IL, parameters);
EmitCreateMethodActivationContext(hostMethod, IL, concreteType);
// Skip the interception if an activator cannot be found
EmitGetActivator(hostMethod, IL, skipInterception);
IL.Emit(OpCodes.Stloc, _currentActivator);
IL.Emit(OpCodes.Ldloc, _currentActivator);
IL.Emit(OpCodes.Brfalse, skipInterception);
// Determine if the activator can instantiate the method from the
// current context
IL.Emit(OpCodes.Ldloc, _currentActivator);
IL.Emit(OpCodes.Ldloc, _methodContext);
IL.Emit(OpCodes.Callvirt, _canActivate);
IL.Emit(OpCodes.Brfalse, skipInterception);
// Use the activator to create the object instance
EmitCreateInstance(IL);
// }
Instruction endCreate = IL.Create(OpCodes.Nop);
IL.Emit(OpCodes.Br, endCreate);
// else {
IL.Append(skipInterception);
// Restore the arguments that were popped off the stack
// by the list of constructor arguments
int parameterCount = parameters.Count;
for (int index = 0; index < parameterCount; index++)
{
ParameterDefinition currentParameter = parameters[index];
IL.Emit(OpCodes.Ldloc, _constructorArguments);
IL.Emit(OpCodes.Ldc_I4, index);
IL.Emit(OpCodes.Callvirt, _getItem);
IL.Emit(OpCodes.Unbox_Any, currentParameter.ParameterType);
}
IL.Emit(OpCodes.Newobj, targetConstructor);
// }
IL.Append(endCreate);
}
开发者ID:svgorbunov,项目名称:ScrollsModLoader,代码行数:51,代码来源:RedirectNewInstancesToActivator.cs
示例14: RewriteMethodBody
protected override void RewriteMethodBody(MethodDefinition method, CilWorker IL, IEnumerable<Instruction> oldInstructions)
{
var newInstructions = new Queue<Instruction>();
foreach (var instruction in oldInstructions)
{
if (!ShouldReplace(instruction, method))
{
IL.Append(instruction);
continue;
}
Replace(instruction, method, IL);
}
}
开发者ID:zxl359592450,项目名称:linfu,代码行数:14,代码来源:InstructionSwapper.cs
示例15: Emit
public void Emit(CilWorker IL)
{
var module = IL.GetModule();
IL.Emit(OpCodes.Ldloc, _aroundInvokeProvider);
IL.Emit(OpCodes.Brfalse, _skipGetSurroundingImplementation);
// var surroundingImplementation = this.GetSurroundingImplementation(this, invocationInfo);
var getSurroundingImplementation = module.ImportMethod<IAroundInvokeProvider>("GetSurroundingImplementation");
IL.Emit(OpCodes.Ldloc, _aroundInvokeProvider);
IL.Emit(OpCodes.Ldloc, _invocationInfo);
IL.Emit(OpCodes.Callvirt, getSurroundingImplementation);
IL.Emit(OpCodes.Stloc, _surroundingImplementation);
}
开发者ID:leehavin,项目名称:linfu,代码行数:14,代码来源:GetSurroundingImplementationInstance.cs
示例16: Emit
public void Emit(CilWorker IL)
{
var module = IL.GetModule();
var method = IL.GetMethod();
var getProvider = _resolveGetProviderMethod(module);
var pushThis = method.HasThis ? OpCodes.Ldarg_0 : OpCodes.Ldnull;
IL.Emit(pushThis);
IL.Emit(OpCodes.Ldloc, _invocationInfo);
IL.Emit(OpCodes.Call, getProvider);
IL.Emit(OpCodes.Stloc, _classMethodReplacementProvider);
}
开发者ID:zxl359592450,项目名称:linfu,代码行数:14,代码来源:GetClassMethodReplacementProvider.cs
示例17: Replace
protected override void Replace(Instruction currentInstruction, MethodDefinition method, CilWorker IL)
{
var constructor = (MethodReference) currentInstruction.Operand;
TypeReference concreteType = constructor.DeclaringType;
ParameterDefinitionCollection parameters = constructor.Parameters;
if (!_emitter.ShouldIntercept(constructor, concreteType, method))
{
// Reuse the old instruction instead of emitting a new one
IL.Append(currentInstruction);
return;
}
_emitter.EmitNewObject(method, IL, constructor, concreteType);
}
开发者ID:svgorbunov,项目名称:ScrollsModLoader,代码行数:15,代码来源:InterceptNewCalls.cs
示例18: AddEpilog
public void AddEpilog(CilWorker IL)
{
var skipEpilog = IL.Create(OpCodes.Nop);
// if (!IsInterceptionDisabled && surroundingImplementation != null) {
IL.Emit(OpCodes.Ldloc, _interceptionDisabled);
IL.Emit(OpCodes.Brtrue, skipEpilog);
// surroundingImplementation.AfterInvoke(invocationInfo, returnValue);
var emitAfterInvoke = new EmitAfterInvoke(_surroundingImplementation, _surroundingClassImplementation, _invocationInfo, _returnValue);
emitAfterInvoke.Emit(IL);
// }
IL.Append(skipEpilog);
}
开发者ID:zxl359592450,项目名称:linfu,代码行数:15,代码来源:SurroundMethodBody.cs
示例19: Emit
/// <summary>
/// Adds method body interception to the target method.
/// </summary>
/// <param name="IL">The <see cref="CilWorker"/> pointing to the target method body.</param>
public void Emit(CilWorker IL)
{
MethodDefinition method = IL.GetMethod();
TypeReference returnType = method.ReturnType.ReturnType;
Instruction endLabel = IL.Create(OpCodes.Nop);
Instruction executeOriginalInstructions = IL.Create(OpCodes.Nop);
// Execute the method body replacement if and only if
// interception is enabled
IL.Emit(OpCodes.Ldloc, _interceptionDisabled);
IL.Emit(OpCodes.Brtrue, executeOriginalInstructions);
Instruction invokeReplacement = IL.Create(OpCodes.Nop);
IL.Emit(OpCodes.Ldloc, _methodReplacementProvider);
IL.Emit(OpCodes.Brtrue, invokeReplacement);
IL.Emit(OpCodes.Ldloc, _classMethodReplacementProvider);
IL.Emit(OpCodes.Brtrue, invokeReplacement);
IL.Emit(OpCodes.Br, executeOriginalInstructions);
IL.Append(invokeReplacement);
// This is equivalent to the following code:
// var replacement = provider.GetMethodReplacement(info);
var invokeMethodReplacement = new InvokeMethodReplacement(executeOriginalInstructions,
_methodReplacementProvider,
_classMethodReplacementProvider, _invocationInfo);
invokeMethodReplacement.Emit(IL);
IL.Emit(OpCodes.Br, endLabel);
#region The original instruction block
IL.Append(executeOriginalInstructions);
var addOriginalInstructions = new AddOriginalInstructions(_oldInstructions, endLabel);
addOriginalInstructions.Emit(IL);
#endregion
// Mark the end of the method body
IL.Append(endLabel);
var saveReturnValue = new SaveReturnValue(returnType, _returnValue);
saveReturnValue.Emit(IL);
}
开发者ID:svgorbunov,项目名称:ScrollsModLoader,代码行数:51,代码来源:AddMethodReplacementImplementation.cs
示例20: Emit
/// <summary>
/// Emits the call to the <see cref="IAfterInvoke"/> instance.
/// </summary>
/// <param name="IL">The <see cref="CilWorker"/> that points to the current method body.</param>
public void Emit(CilWorker IL)
{
var targetMethod = IL.GetMethod();
var declaringType = targetMethod.DeclaringType;
var module = declaringType.Module;
var getSurroundingClassImplementation = new GetSurroundingClassImplementation(_invocationInfo,
_surroundingClassImplementation,
_registryType.GetMethod(
"GetSurroundingImplementation"));
// var classAroundInvoke = AroundInvokeRegistry.GetSurroundingImplementation(info);
getSurroundingClassImplementation.Emit(IL);
// classAroundInvoke.BeforeInvoke(info);
var skipInvoke = IL.Create(OpCodes.Nop);
IL.Emit(OpCodes.Ldloc, _surroundingClassImplementation);
IL.Emit(OpCodes.Brfalse, skipInvoke);
var beforeInvoke = module.ImportMethod<IBeforeInvoke>("BeforeInvoke");
// surroundingImplementation.BeforeInvoke(invocationInfo);
IL.Emit(OpCodes.Ldloc, _surroundingClassImplementation);
IL.Emit(OpCodes.Ldloc, _invocationInfo);
IL.Emit(OpCodes.Callvirt, beforeInvoke);
IL.Append(skipInvoke);
// if (surroundingImplementation != null) {
if (!targetMethod.HasThis)
return;
var skipInvoke1 = IL.Create(OpCodes.Nop);
IL.Emit(OpCodes.Ldloc, _surroundingImplementation);
IL.Emit(OpCodes.Brfalse, skipInvoke1);
var beforeInvoke1 = module.ImportMethod<IBeforeInvoke>("BeforeInvoke");
// surroundingImplementation.BeforeInvoke(invocationInfo);
IL.Emit(OpCodes.Ldloc, _surroundingImplementation);
IL.Emit(OpCodes.Ldloc, _invocationInfo);
IL.Emit(OpCodes.Callvirt, beforeInvoke1);
IL.Append(skipInvoke1);
// }
}
开发者ID:jam231,项目名称:LinFu,代码行数:51,代码来源:EmitBeforeInvoke.cs
注:本文中的Mono.Cecil.Cil.CilWorker类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论