public void Weave(ILGenerator ilGenerator) { var typeofType = typeof(Type); var typeofObject = typeof(object); FieldBuilder contractFieldBuilder = null; LocalBuilder typesArrayLocalBuilder = null; LocalBuilder tempTypesArrayLocalBuilder = null; var typeofArrayOfTypes = typeofType.MakeArrayType(); var weavingSettings = aspectWeavingSettings.WeavingSettings; var getTypeFromHandleMethodInfo = typeofType.GetMethod("GetTypeFromHandle"); var localBuilderRepository = aspectWeavingSettings.LocalBuilderRepository; typesArrayLocalBuilder = localBuilderRepository.Declare(() => { return ilGenerator.DeclareLocal(typeofArrayOfTypes); }); tempTypesArrayLocalBuilder = ilGenerator.DeclareLocal(typeofArrayOfTypes); ilGenerator.EmitPushInteger(parameters.Length); ilGenerator.Emit(OpCodes.Newarr, typeofType); ilGenerator.EmitStoreLocal(tempTypesArrayLocalBuilder); parameters.ForEach((parameter, i) => { var isByRef = parameter.IsByRef; if (isByRef) { parameter = parameter.GetElementType(); } ilGenerator.EmitLoadLocal(tempTypesArrayLocalBuilder); ilGenerator.EmitPushInteger(i); ilGenerator.Emit(OpCodes.Ldtoken, parameter); ilGenerator.Emit(OpCodes.Call, getTypeFromHandleMethodInfo); if (isByRef) { ilGenerator.Emit(OpCodes.Callvirt, typeofType.GetMethod("MakeByRefType")); } ilGenerator.Emit(OpCodes.Stelem_Ref); }); ilGenerator.EmitLoadLocal(tempTypesArrayLocalBuilder); ilGenerator.EmitStoreLocal(typesArrayLocalBuilder); ilGenerator.EmitLoadArg(0); contractFieldBuilder = weavingSettings.TypeDefinition.GetFieldBuilder(weavingSettings.ContractType); ilGenerator.Emit(OpCodes.Ldfld, contractFieldBuilder); ilGenerator.Emit(OpCodes.Callvirt, typeofObject.GetMethod("GetType")); ilGenerator.Emit(OpCodes.Ldstr, method.Name); ilGenerator.EmitLoadLocal(typesArrayLocalBuilder); ilGenerator.Emit(OpCodes.Callvirt, typeofType.GetMethod("GetMethod", new[] { typeof(string), typeof(Type[]) })); ilGenerator.EmitStoreLocal(methodLocalBuilder); }
public override LocalBuilder BuildArguments(ILGenerator ilGenerator) { LocalBuilder propertyLocalBuilder = null; FieldBuilder contractFieldBuilder = null; LocalBuilder aspectArgLocalBuilder = null; ConstructorInfo ctorInterceptionArgs = null; AbstractAspectPropertyArgsWeaver methodWeaver = null; propertyLocalBuilder = LocalBuilderRepository.Declare(() => { return ilGenerator.DeclareLocal(typeof(PropertyInfo)); }); ctorInterceptionArgs = ArgumentType.GetConstructors()[0]; aspectArgLocalBuilder = ilGenerator.DeclareLocal(ArgumentType); contractFieldBuilder = WeavingSettings.TypeDefinition.GetFieldBuilder(WeavingSettings.ContractType); methodWeaver = new AspectArgsGetPropertyWeaver(Member, propertyLocalBuilder, aspectWeavingSettings); methodWeaver.Weave(ilGenerator); ilGenerator.EmitLoadArg(0); ilGenerator.Emit(OpCodes.Ldfld, contractFieldBuilder); ilGenerator.EmitLoadLocal(propertyLocalBuilder); ilGenerator.Emit(OpCodes.Ldsfld, BindingsDependency); ilGenerator.Emit(OpCodes.Newobj, ctorInterceptionArgs); ilGenerator.EmitStoreLocal(aspectArgLocalBuilder); return aspectArgLocalBuilder; }
public override LocalBuilder BuildArguments(ILGenerator ilGenerator) { var aspectArgLocalBuilder = ilGenerator.DeclareLocal(ArgumentType); var eventArgumentContract = Member.ToEventArgumentContract(); var ctorInterceptionArgs = ArgumentType.GetConstructors().Single(ctor => ctor.GetParameters().Length != 0); var eventBrokerProperty = eventArgumentContract.GetProperty("EventBroker"); var eventBrokerType = eventBrokerProperty.PropertyType; var handlerType = eventBrokerType.GetGenericArguments().First(); var parameters = handlerType.GetInvokeMethod().GetParameters(); ilGenerator.EmitLoadArg(1); ilGenerator.Emit(OpCodes.Ldind_Ref); ilGenerator.EmitLoadArg(3); ilGenerator.Emit(OpCodes.Callvirt, eventArgumentContract.GetProperty("Event").GetGetMethod()); ilGenerator.EmitLoadArg(3); ilGenerator.Emit(OpCodes.Callvirt, eventArgumentContract.GetProperty("Handler").GetGetMethod()); ilGenerator.Emit(OpCodes.Ldsfld, BindingsDependency); ilGenerator.EmitLoadArg(3); ilGenerator.Emit(OpCodes.Callvirt, eventBrokerProperty.GetGetMethod()); parameters.ForEach(1, (arg, i) => { var property = ArgumentType.GetProperty("Arg{0}".Fmt(i)); ilGenerator.EmitLoadArg(3); ilGenerator.Emit(OpCodes.Callvirt, property.GetGetMethod()); }); ilGenerator.Emit(OpCodes.Newobj, ctorInterceptionArgs); ilGenerator.EmitStoreLocal(aspectArgLocalBuilder); return aspectArgLocalBuilder; }
public override LocalBuilder BuildArguments(ILGenerator ilGenerator) { var typeDefinition = (IAspectTypeDefinition)WeavingSettings.TypeDefinition; var aspectArgLocalBuilder = ilGenerator.DeclareLocal(ArgumentType); var eventLocalBuilder = ilGenerator.DeclareLocal(typeof(EventInfo)); var contractFieldBuilder = typeDefinition.GetFieldBuilder(WeavingSettings.ContractType); var eventArgumentContract = Member.ToEventArgumentContract(); var eventBrokerProperty = eventArgumentContract.GetProperty("EventBroker"); var eventBrokerType = eventBrokerProperty.PropertyType; var handlerType = eventBrokerType.GetGenericArguments().First(); var delegateLocalBuilder = ilGenerator.DeclareLocal(handlerType); var delegateCtor = handlerType.GetConstructor(new[] { typeof(object), typeof(IntPtr) }); var eventBrokerFieldBuilder = typeDefinition.GetEventFieldBuilder(Member.Name, eventBrokerType); var eventBrokerFieldTypeDefinition = typeDefinition.GetEventBrokerFielTypeDefinition(Member); var ctorInterceptionArgs = ArgumentType.GetConstructors().Single(ctor => ctor.GetParameters().Length != 0); var parameters = handlerType.GetInvokeMethod().GetParameters(); ilGenerator.EmitLoadArg(1); ilGenerator.Emit(OpCodes.Ldftn, eventBrokerFieldTypeDefinition.Event.EventHandlerType.GetInvokeMethod()); ilGenerator.Emit(OpCodes.Newobj, delegateCtor); ilGenerator.EmitStoreLocal(delegateLocalBuilder); ilGenerator.EmitLoadArg(0); ilGenerator.Emit(OpCodes.Ldfld, contractFieldBuilder); ilGenerator.Emit(OpCodes.Callvirt, typeof(object).GetMethod("GetType")); ilGenerator.Emit(OpCodes.Ldstr, Member.Name); ilGenerator.Emit(OpCodes.Callvirt, typeof(Type).GetMethod("GetEvent", new[] { typeof(string) })); ilGenerator.EmitStoreLocal(eventLocalBuilder); ilGenerator.EmitLoadArg(0); ilGenerator.Emit(OpCodes.Ldfld, contractFieldBuilder); ilGenerator.EmitLoadLocal(eventLocalBuilder); ilGenerator.EmitLoadLocal(delegateLocalBuilder); ilGenerator.Emit(OpCodes.Ldsfld, BindingsDependency); ilGenerator.EmitLoadArg(0); ilGenerator.Emit(OpCodes.Ldfld, eventBrokerFieldBuilder); parameters.ForEach(1, (arg, i) => { var property = ArgumentType.GetProperty("Arg{0}".Fmt(i)); ilGenerator.EmitLoadArg(1); ilGenerator.Emit(OpCodes.Callvirt, property.GetGetMethod()); }); ilGenerator.Emit(OpCodes.Newobj, ctorInterceptionArgs); ilGenerator.EmitStoreLocal(aspectArgLocalBuilder); return aspectArgLocalBuilder; }
public void Weave(ILGenerator ilGenerator) { var typeofException = typeof(Exception); LocalBuilder exceptionLocalBuilder = null; var typeofFlowBehavior = typeof(FlowBehavior); LocalBuilder flowBehavoiurLocalBuilder = null; var afterRethrowLabel = ilGenerator.DefineLabel(); var throwFlowBehaviorLabel = ilGenerator.DefineLabel(); var rethrowFlowBehaviorLabel = ilGenerator.DefineLabel(); var argsImplLocalBuilder = localBuilderRepository.Get(aspectArgumentType); var jumpTable = new[] { throwFlowBehaviorLabel, rethrowFlowBehaviorLabel }; var setExceptionMethodInfo = aspectArgumentType.GetProperty("Exception").GetSetMethod(); var flowBehaviorMethodInfo = aspectArgumentType.GetProperty("FlowBehavior").GetGetMethod(); exceptionLocalBuilder = localBuilderRepository.GetOrDeclare(typeofException, () => { return ilGenerator.DeclareLocal(typeofException); }); flowBehavoiurLocalBuilder = localBuilderRepository.GetOrDeclare(typeofFlowBehavior, () => { return ilGenerator.DeclareLocal(typeofFlowBehavior); }); ilGenerator.BeginCatchBlock(typeofException); ilGenerator.EmitStoreLocal(exceptionLocalBuilder); ilGenerator.EmitLoadLocal(argsImplLocalBuilder); ilGenerator.EmitLoadLocal(exceptionLocalBuilder); ilGenerator.Emit(OpCodes.Callvirt, setExceptionMethodInfo); catchWeavers.ForEach(weaver => weaver.Weave(ilGenerator)); ilGenerator.EmitLoadLocal(argsImplLocalBuilder); ilGenerator.Emit(OpCodes.Callvirt, flowBehaviorMethodInfo); ilGenerator.EmitStoreLocal(flowBehavoiurLocalBuilder); ilGenerator.EmitLoadLocal(flowBehavoiurLocalBuilder); ilGenerator.EmitPushInteger(1); ilGenerator.Emit(OpCodes.Sub); ilGenerator.Emit(OpCodes.Switch, jumpTable); ilGenerator.Emit(OpCodes.Br_S, afterRethrowLabel); ilGenerator.MarkLabel(throwFlowBehaviorLabel); ilGenerator.EmitLoadLocal(exceptionLocalBuilder); ilGenerator.Emit(OpCodes.Throw); ilGenerator.MarkLabel(rethrowFlowBehaviorLabel); ilGenerator.Emit(OpCodes.Rethrow); ilGenerator.MarkLabel(afterRethrowLabel); }
public void Weave(ILGenerator ilGenerator) { var typeofType = typeof(Type); var typeofObject = typeof(object); FieldBuilder contractFieldBuilder = null; var weavingSettings = aspectWeavingSettings.WeavingSettings; var getTypeFromHandleMethodInfo = typeofType.GetMethod("GetTypeFromHandle"); contractFieldBuilder = weavingSettings.TypeDefinition.GetFieldBuilder(weavingSettings.ContractType); ilGenerator.EmitLoadArg(0); ilGenerator.Emit(OpCodes.Ldfld, contractFieldBuilder); ilGenerator.Emit(OpCodes.Callvirt, typeofObject.GetMethod("GetType")); ilGenerator.Emit(OpCodes.Ldstr, property.Name); ilGenerator.Emit(OpCodes.Ldtoken, property.PropertyType); ilGenerator.Emit(OpCodes.Call, getTypeFromHandleMethodInfo); ilGenerator.Emit(OpCodes.Callvirt, typeofType.GetMethod("GetProperty", new[] { typeof(string), typeof(Type) })); ilGenerator.EmitStoreLocal(propertyLocalBuilder); }
public override LocalBuilder BuildArguments(ILGenerator ilGenerator) { LocalBuilder aspectArgLocalBuilder = null; ConstructorInfo ctorInterceptionArgs = null; var aspectArgsType = Member.ToPropertyArgumentContract(); ctorInterceptionArgs = ArgumentType.GetConstructors()[0]; aspectArgLocalBuilder = ilGenerator.DeclareLocal(ArgumentType); ilGenerator.EmitLoadArg(1); ilGenerator.Emit(OpCodes.Ldind_Ref); ilGenerator.EmitLoadArg(2); ilGenerator.Emit(OpCodes.Callvirt, aspectArgsType.GetProperty("Property").GetGetMethod()); ilGenerator.Emit(OpCodes.Ldsfld, bindingsDependency); ilGenerator.Emit(OpCodes.Newobj, ctorInterceptionArgs); ilGenerator.EmitStoreLocal(aspectArgLocalBuilder); return aspectArgLocalBuilder; }
public override void StoreArgsIfNeeded(ILGenerator ilGenerator) { parameters.ForEach(param => { LocalBuilder localBuilder; int argPosition = param.Position + 1; Type parameterElementType = param.ParameterType.GetElementType(); var property = aspectArgumentType.GetProperty("Arg{0}".Fmt(argPosition)); if (!byRefParamslocalBuilderMap.TryGetValue(argPosition, out localBuilder)) { localBuilder = ilGenerator.DeclareLocal(parameterElementType); byRefParamslocalBuilderMap.Add(argPosition, localBuilder); } WeaveAspectArg(ilGenerator); ilGenerator.Emit(OpCodes.Callvirt, property.GetGetMethod()); ilGenerator.EmitStoreLocal(localBuilder); }); }