示例#1
0
 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) }
     );
 }
示例#2
0
 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);
 }
示例#3
0
        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);
 }
示例#6
0
 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;
        }
示例#10
0
        /// <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);
                }
            }
        }