private static void Test(System.Reflection.Emit.TypeBuilder xExtensions, System.Reflection.Emit.TypeBuilder xRow) { // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2014/201401/20140115/xlsx xExtensions.DefineMethod("AsDataTable", default(MethodAttributes), null, // parameter types // there is a fault here. new[] { typeof(IEnumerable<>).MakeGenericType(xRow) } ); }
private void AddGetter(System.Reflection.Emit.TypeBuilder typeBuilder, FieldBuilder fieldBuilder, PropertyBuilder propertyBuilder) { MethodBuilder propertyGetter = typeBuilder.DefineMethod("get_" + _propertyName, MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, _propertyType, Type.EmptyTypes); var ilGenerator = propertyGetter.GetILGenerator(); ilGenerator.Emit(OpCodes.Ldarg_0); ilGenerator.Emit(OpCodes.Ldfld, fieldBuilder); ilGenerator.Emit(OpCodes.Ret); propertyBuilder.SetGetMethod(propertyGetter); }
private static void Test(System.Reflection.Emit.TypeBuilder xExtensions, ref foo f) { // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2014/201401/20140118 // X:\jsc.svn\examples\rewrite\Test\TestStackRewriter\TestStackRewriter\Program.cs // https://sites.google.com/a/jsc-solutions.net/backlog/knowledge-base/2014/201401/20140115/xlsx f.m = xExtensions.DefineMethod("AsDataTable", default(MethodAttributes), null, // parameter types // there is a fault here. new[] { typeof(IEnumerable<>).MakeGenericType(f.x) } ); }
private void AddGetter(System.Reflection.Emit.TypeBuilder typeBuilder, PropertyBuilder propertyBuilder) { MethodBuilder propertyGetter = typeBuilder.DefineMethod("get_" + _propertyInfo.Name, MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, _propertyInfo.PropertyType, Type.EmptyTypes); var ilGenerator = propertyGetter.GetILGenerator(); ilGenerator.Emit(OpCodes.Ldarg_0); ilGenerator.Emit(OpCodes.Ldfld, _aggregate); MethodInfo getter = _propertyInfo.GetAccessors().First(accessor => accessor.ReturnType != typeof (void)); ilGenerator.Emit(OpCodes.Callvirt, getter); ilGenerator.Emit(OpCodes.Ret); propertyBuilder.SetGetMethod(propertyGetter); }
private void AddSetter(System.Reflection.Emit.TypeBuilder typeBuilder, PropertyBuilder propertyBuilder) { MethodBuilder propertySetter = typeBuilder.DefineMethod("set_" + _propertyInfo.Name, MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, null, new Type[] { _propertyInfo.PropertyType }); var propertySetterIl = propertySetter.GetILGenerator(); propertySetterIl.Emit(OpCodes.Ldarg_0); propertySetterIl.Emit(OpCodes.Ldfld, _aggregate); propertySetterIl.Emit(OpCodes.Ldarg_1); MethodInfo setter = _propertyInfo.GetAccessors().First(accessor => accessor.ReturnType == typeof(void)); propertySetterIl.Emit(OpCodes.Callvirt, setter); propertySetterIl.Emit(OpCodes.Ret); propertyBuilder.SetSetMethod(propertySetter); }
private void AddSetter(System.Reflection.Emit.TypeBuilder typeBuilder, FieldBuilder fieldBuilder, PropertyBuilder propertyBuilder) { MethodBuilder propertySetter = typeBuilder.DefineMethod("set_" + _propertyName, MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, null, new Type[] { _propertyType }); var propertySetterIl = propertySetter.GetILGenerator(); propertySetterIl.Emit(OpCodes.Ldarg_0); propertySetterIl.Emit(OpCodes.Ldarg_1); propertySetterIl.Emit(OpCodes.Stfld, fieldBuilder); propertySetterIl.Emit(OpCodes.Ret); propertyBuilder.SetSetMethod(propertySetter); }
static Tuple<EventBuilder, FieldBuilder> GenerateEvent(System.Reflection.Emit.TypeBuilder typeBuilder, IEventCaller @event) { var eventName = @event.Name; var eventHandlerType = @event.EventHandlerType; var eventHandlerTypes = new[] { eventHandlerType }; var eventBackingField = typeBuilder.DefineField("m_" + eventName, eventHandlerType, FieldAttributes.Private); var voidType = typeof(void); //Combine event var add = typeBuilder.DefineMethod("add_" + eventName, VirtPublicProperty | MethodAttributes.Final | MethodAttributes.NewSlot, voidType, eventHandlerTypes); var generator = add.GetILGenerator(); generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Ldfld, eventBackingField); generator.Emit(OpCodes.Ldarg_1); generator.Emit(OpCodes.Call, _delegateCombine.Value); generator.Emit(OpCodes.Castclass, eventHandlerType); generator.Emit(OpCodes.Stfld, eventBackingField); generator.Emit(OpCodes.Ret); //Remove event var remove = typeBuilder.DefineMethod("remove_" + eventName, VirtPublicProperty | MethodAttributes.Final | MethodAttributes.NewSlot, voidType, eventHandlerTypes); generator = remove.GetILGenerator(); generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Ldfld, eventBackingField); generator.Emit(OpCodes.Ldarg_1); generator.Emit(OpCodes.Call, _delegateRemove.Value); generator.Emit(OpCodes.Castclass, eventHandlerType); generator.Emit(OpCodes.Stfld, eventBackingField); generator.Emit(OpCodes.Ret); //event var eventBuilder = typeBuilder.DefineEvent(eventName, EventAttributes.None, eventHandlerType); eventBuilder.SetAddOnMethod(add); eventBuilder.SetRemoveOnMethod(remove); return Tuple.Create(eventBuilder, eventBackingField); }
static void OverrideParentPropertiesForPropertyChanged(System.Reflection.Emit.TypeBuilder typeBuilder, Type parent, MethodInfo raiseEvent) { foreach (var propertyInfo in Info.Extended.Properties(parent)) { var propertySetter = propertyInfo.GetSetMethod(); if (propertySetter == null) continue; if (!propertySetter.IsVirtual) continue; var name = propertyInfo.Name; var pb = typeBuilder.DefineProperty(name, PropertyAttributes.None, propertyInfo.MemberType, Type.EmptyTypes); ILGenerator generator; var propertyGetter = propertyInfo.GetGetMethod(); if (propertyGetter != null) { var getMethod = typeBuilder.DefineMethod("get_" + name, VirtPublicProperty, propertyInfo.MemberType, Type.EmptyTypes); generator = getMethod.GetILGenerator(); generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Call, propertyGetter); generator.Emit(OpCodes.Ret); pb.SetGetMethod(getMethod); } var setMethod = typeBuilder.DefineMethod("set_" + name, VirtPublicProperty, typeof(void), new[] {propertyInfo.MemberType}); generator = setMethod.GetILGenerator(); generator.Emit(OpCodes.Ldarg_0); if (propertyGetter != null) { generator.Emit(OpCodes.Call, propertyGetter); generator.Emit(OpCodes.Ldarg_1); var setValueLabel = generator.DefineLabel(); generator.Emit(OpCodes.Bne_Un_S, setValueLabel); generator.Emit(OpCodes.Ret); generator.MarkLabel(setValueLabel); generator.Emit(OpCodes.Ldarg_0); } generator.Emit(OpCodes.Ldarg_1); generator.Emit(OpCodes.Call, propertySetter); generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Ldstr, name); generator.Emit(OpCodes.Call, raiseEvent); generator.Emit(OpCodes.Ret); pb.SetSetMethod(setMethod); } }
static MethodBuilder BuildOnPropertyChanged(System.Reflection.Emit.TypeBuilder typeBuilder, EventBuilder eventBuilder, FieldInfo eventBackingField) { var raisePropertyChanged = typeBuilder.DefineMethod("OnPropertyChanged", MethodAttributes.Private, typeof(void), new[] {typeof(string)}); var generator = raisePropertyChanged.GetILGenerator(); var returnLabel = generator.DefineLabel(); generator.DeclareLocal(typeof(PropertyChangedEventHandler)); generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Ldfld, eventBackingField); generator.Emit(OpCodes.Stloc_0); generator.Emit(OpCodes.Ldloc_0); generator.Emit(OpCodes.Ldnull); generator.Emit(OpCodes.Ceq); generator.Emit(OpCodes.Brtrue, returnLabel); generator.Emit(OpCodes.Ldloc_0); generator.Emit(OpCodes.Ldarg_0); generator.Emit(OpCodes.Ldarg_1); generator.Emit(OpCodes.Newobj, _createEventArgs.Value); generator.Emit(OpCodes.Callvirt, Info<ProgressChangedEventHandler>.GetMethod("Invoke").First().MethodInfo); generator.MarkLabel(returnLabel); generator.Emit(OpCodes.Ret); eventBuilder.SetRaiseMethod(raisePropertyChanged); return raisePropertyChanged; }
/// <summary> /// Compile the Binder methods /// </summary> /// <param name="engine">ScriptEngine</param> /// <param name="typeBuilder">The TypeBuilder to attach the compiled Binder methods to</param> public void Compile(ScriptEngine engine, System.Reflection.Emit.TypeBuilder typeBuilder) { int length = this.HasParamArray ? Binder.MaximumCachedParameterCount : this.FunctionLength; for (int argumentCount = 0; argumentCount <= length; argumentCount++) { string compiledName = GetCompiledName(argumentCount); if (!engine.compiledBinders.Contains(compiledName)) { engine.compiledBinders.Add(compiledName); var methodBuilder = typeBuilder.DefineMethod( compiledName, System.Reflection.MethodAttributes.HideBySig | System.Reflection.MethodAttributes.Static | System.Reflection.MethodAttributes.Public, typeof(object), new Type[] { typeof(ScriptEngine), typeof(object), typeof(object[]) }); // Generate the IL for the method. ILGenerator generator = new ReflectionEmitILGenerator(methodBuilder.GetILGenerator()); GenerateStub(generator, argumentCount); } } }