Ejemplo n.º 1
0
        private static void CreateDynamicAssembly()
        {
            new SecurityPermission(SecurityPermissionFlag.ControlEvidence).Assert();
            Type[]        types      = new Type[] { typeof(Type), typeof(Type), typeof(string) };
            MethodInfo    methodInfo = typeof(Delegate).GetMethod("CreateDelegate", types);
            DynamicMethod method     = new DynamicMethod("CreateDelegate", typeof(Delegate), types);

            method.DefineParameter(1, ParameterAttributes.In, "delegateType");
            method.DefineParameter(2, ParameterAttributes.In, "targetType");
            method.DefineParameter(3, ParameterAttributes.In, "methodName");
            ILGenerator iLGenerator = method.GetILGenerator(5);

            iLGenerator.Emit(OpCodes.Ldarg_0);
            iLGenerator.Emit(OpCodes.Ldarg_1);
            iLGenerator.Emit(OpCodes.Ldarg_2);
            iLGenerator.EmitCall(OpCodes.Call, methodInfo, null);
            iLGenerator.Emit(OpCodes.Ret);
            s_CreateDelegate1 = (CreateDelegate1Delegate)method.CreateDelegate(typeof(CreateDelegate1Delegate));
            types             = new Type[] { typeof(Type), typeof(object), typeof(string) };
            methodInfo        = typeof(Delegate).GetMethod("CreateDelegate", types);
            method            = new DynamicMethod("CreateDelegate", typeof(Delegate), types);
            method.DefineParameter(1, ParameterAttributes.In, "delegateType");
            method.DefineParameter(2, ParameterAttributes.In, "target");
            method.DefineParameter(3, ParameterAttributes.In, "methodName");
            iLGenerator = method.GetILGenerator(5);
            iLGenerator.Emit(OpCodes.Ldarg_0);
            iLGenerator.Emit(OpCodes.Ldarg_1);
            iLGenerator.Emit(OpCodes.Ldarg_2);
            iLGenerator.EmitCall(OpCodes.Call, methodInfo, null);
            iLGenerator.Emit(OpCodes.Ret);
            s_CreateDelegate2 = (CreateDelegate2Delegate)method.CreateDelegate(typeof(CreateDelegate2Delegate));
            types             = new Type[] { typeof(Type), typeof(object[]) };
            methodInfo        = typeof(Activator).GetMethod("CreateInstance", types);
            method            = new DynamicMethod("CreateInstance", typeof(object), types);
            method.DefineParameter(1, ParameterAttributes.In, "type");
            method.DefineParameter(2, ParameterAttributes.In, "arguments");
            iLGenerator = method.GetILGenerator(4);
            iLGenerator.Emit(OpCodes.Ldarg_0);
            iLGenerator.Emit(OpCodes.Ldarg_1);
            iLGenerator.EmitCall(OpCodes.Call, methodInfo, null);
            iLGenerator.Emit(OpCodes.Ret);
            s_CreateInstance = (CreateInstanceDelegate)method.CreateDelegate(typeof(CreateInstanceDelegate));
            types            = new Type[] { typeof(object), typeof(object[]) };
            Type[] parameterTypes = new Type[] { typeof(MethodInfo), typeof(object), typeof(object[]) };
            methodInfo = typeof(MethodInfo).GetMethod("Invoke", types);
            method     = new DynamicMethod("InvokeMethod", typeof(object), parameterTypes);
            method.DefineParameter(1, ParameterAttributes.In, "method");
            method.DefineParameter(2, ParameterAttributes.In, "instance");
            method.DefineParameter(3, ParameterAttributes.In, "args");
            iLGenerator = method.GetILGenerator(5);
            iLGenerator.Emit(OpCodes.Ldarg_0);
            iLGenerator.Emit(OpCodes.Ldarg_1);
            iLGenerator.Emit(OpCodes.Ldarg_2);
            iLGenerator.EmitCall(OpCodes.Callvirt, methodInfo, null);
            iLGenerator.Emit(OpCodes.Ret);
            s_InvokeMethod = (InvokeMethodDelegate)method.CreateDelegate(typeof(InvokeMethodDelegate));
        }
 private static void CreateDynamicAssembly()
 {
     new SecurityPermission(SecurityPermissionFlag.ControlEvidence).Assert();
     Type[] types = new Type[] { typeof(Type), typeof(Type), typeof(string) };
     MethodInfo methodInfo = typeof(Delegate).GetMethod("CreateDelegate", types);
     DynamicMethod method = new DynamicMethod("CreateDelegate", typeof(Delegate), types);
     method.DefineParameter(1, ParameterAttributes.In, "delegateType");
     method.DefineParameter(2, ParameterAttributes.In, "targetType");
     method.DefineParameter(3, ParameterAttributes.In, "methodName");
     ILGenerator iLGenerator = method.GetILGenerator(5);
     iLGenerator.Emit(OpCodes.Ldarg_0);
     iLGenerator.Emit(OpCodes.Ldarg_1);
     iLGenerator.Emit(OpCodes.Ldarg_2);
     iLGenerator.EmitCall(OpCodes.Call, methodInfo, null);
     iLGenerator.Emit(OpCodes.Ret);
     s_CreateDelegate1 = (CreateDelegate1Delegate) method.CreateDelegate(typeof(CreateDelegate1Delegate));
     types = new Type[] { typeof(Type), typeof(object), typeof(string) };
     methodInfo = typeof(Delegate).GetMethod("CreateDelegate", types);
     method = new DynamicMethod("CreateDelegate", typeof(Delegate), types);
     method.DefineParameter(1, ParameterAttributes.In, "delegateType");
     method.DefineParameter(2, ParameterAttributes.In, "target");
     method.DefineParameter(3, ParameterAttributes.In, "methodName");
     iLGenerator = method.GetILGenerator(5);
     iLGenerator.Emit(OpCodes.Ldarg_0);
     iLGenerator.Emit(OpCodes.Ldarg_1);
     iLGenerator.Emit(OpCodes.Ldarg_2);
     iLGenerator.EmitCall(OpCodes.Call, methodInfo, null);
     iLGenerator.Emit(OpCodes.Ret);
     s_CreateDelegate2 = (CreateDelegate2Delegate) method.CreateDelegate(typeof(CreateDelegate2Delegate));
     types = new Type[] { typeof(Type), typeof(object[]) };
     methodInfo = typeof(Activator).GetMethod("CreateInstance", types);
     method = new DynamicMethod("CreateInstance", typeof(object), types);
     method.DefineParameter(1, ParameterAttributes.In, "type");
     method.DefineParameter(2, ParameterAttributes.In, "arguments");
     iLGenerator = method.GetILGenerator(4);
     iLGenerator.Emit(OpCodes.Ldarg_0);
     iLGenerator.Emit(OpCodes.Ldarg_1);
     iLGenerator.EmitCall(OpCodes.Call, methodInfo, null);
     iLGenerator.Emit(OpCodes.Ret);
     s_CreateInstance = (CreateInstanceDelegate) method.CreateDelegate(typeof(CreateInstanceDelegate));
     types = new Type[] { typeof(object), typeof(object[]) };
     Type[] parameterTypes = new Type[] { typeof(MethodInfo), typeof(object), typeof(object[]) };
     methodInfo = typeof(MethodInfo).GetMethod("Invoke", types);
     method = new DynamicMethod("InvokeMethod", typeof(object), parameterTypes);
     method.DefineParameter(1, ParameterAttributes.In, "method");
     method.DefineParameter(2, ParameterAttributes.In, "instance");
     method.DefineParameter(3, ParameterAttributes.In, "args");
     iLGenerator = method.GetILGenerator(5);
     iLGenerator.Emit(OpCodes.Ldarg_0);
     iLGenerator.Emit(OpCodes.Ldarg_1);
     iLGenerator.Emit(OpCodes.Ldarg_2);
     iLGenerator.EmitCall(OpCodes.Callvirt, methodInfo, null);
     iLGenerator.Emit(OpCodes.Ret);
     s_InvokeMethod = (InvokeMethodDelegate) method.CreateDelegate(typeof(InvokeMethodDelegate));
 }
Ejemplo n.º 3
0
        private static void CreateDynamicAssembly()
        {
            // 1. Assert permissions demanded by the DynamicMethod ctor.
            new SecurityPermission(SecurityPermissionFlag.ControlEvidence).Assert(); // BlessedAssert

            // 2. Create the transparent methods, each wrapping a call to a reflection method,
            //    and cache a delegate to each method.
            Type[]        parameterTypes;        // signature of the reflection method
            Type[]        wrappedParameterTypes; // signature of the wrapping method (when different)
            MethodInfo    mi;                    // descriptor for the reflection method
            DynamicMethod method;                // wrapping method
            ILGenerator   il;                    // wrapping method's generator

            // 2a. Delegate.CreateDelegate( Type, Type, String )
            parameterTypes = new Type[] { typeof(Type), typeof(Type), typeof(String) };
            mi             = typeof(Delegate).GetMethod("CreateDelegate", parameterTypes);

            method = new DynamicMethod("CreateDelegate", typeof(Delegate), parameterTypes);
            method.DefineParameter(1, ParameterAttributes.In, "delegateType");
            method.DefineParameter(2, ParameterAttributes.In, "targetType");
            method.DefineParameter(3, ParameterAttributes.In, "methodName");

            il = method.GetILGenerator(5);
            il.Emit(OpCodes.Ldarg_0);               // push delegateType
            il.Emit(OpCodes.Ldarg_1);               // push targetType
            il.Emit(OpCodes.Ldarg_2);               // push methodName
            il.EmitCall(OpCodes.Call, mi, null);    // call Delegate.CreateDelegate
            il.Emit(OpCodes.Ret);                   // return the result

            s_CreateDelegate1 = (CreateDelegate1Delegate)method.CreateDelegate(typeof(CreateDelegate1Delegate));

            // 2b. Delegate.CreateDelegate( Type, Object, String )
            parameterTypes = new Type[] { typeof(Type), typeof(Object), typeof(String) };
            mi             = typeof(Delegate).GetMethod("CreateDelegate", parameterTypes);

            method = new DynamicMethod("CreateDelegate", typeof(Delegate), parameterTypes);
            method.DefineParameter(1, ParameterAttributes.In, "delegateType");
            method.DefineParameter(2, ParameterAttributes.In, "target");
            method.DefineParameter(3, ParameterAttributes.In, "methodName");

            il = method.GetILGenerator(5);
            il.Emit(OpCodes.Ldarg_0);               // push delegateType
            il.Emit(OpCodes.Ldarg_1);               // push target
            il.Emit(OpCodes.Ldarg_2);               // push methodName
            il.EmitCall(OpCodes.Call, mi, null);    // call Delegate.CreateDelegate
            il.Emit(OpCodes.Ret);                   // return the result

            s_CreateDelegate2 = (CreateDelegate2Delegate)method.CreateDelegate(typeof(CreateDelegate2Delegate));

            // 2c. Activator.CreateInstance( Type, Object[] )
            parameterTypes = new Type[] { typeof(Type), typeof(Object[]) };
            mi             = typeof(Activator).GetMethod("CreateInstance", parameterTypes);

            method = new DynamicMethod("CreateInstance", typeof(Object), parameterTypes);
            method.DefineParameter(1, ParameterAttributes.In, "type");
            method.DefineParameter(2, ParameterAttributes.In, "arguments");

            il = method.GetILGenerator(4);
            il.Emit(OpCodes.Ldarg_0);               // push type
            il.Emit(OpCodes.Ldarg_1);               // push arguments
            il.EmitCall(OpCodes.Call, mi, null);    // call Activator.CreateInstance
            il.Emit(OpCodes.Ret);                   // return the result

            s_CreateInstance = (CreateInstanceDelegate)method.CreateDelegate(typeof(CreateInstanceDelegate));

            // 2d. MethodInfo.Invoke(object, args)
            parameterTypes        = new Type[] { typeof(Object), typeof(Object[]) };
            wrappedParameterTypes = new Type[] { typeof(MethodInfo), typeof(Object), typeof(Object[]) };
            mi = typeof(MethodInfo).GetMethod("Invoke", parameterTypes);

            method = new DynamicMethod("InvokeMethod", typeof(Object), wrappedParameterTypes);
            method.DefineParameter(1, ParameterAttributes.In, "method");
            method.DefineParameter(2, ParameterAttributes.In, "instance");
            method.DefineParameter(3, ParameterAttributes.In, "args");

            il = method.GetILGenerator(5);
            il.Emit(OpCodes.Ldarg_0);                // push method
            il.Emit(OpCodes.Ldarg_1);                // push instance
            il.Emit(OpCodes.Ldarg_2);                // push args
            il.EmitCall(OpCodes.Callvirt, mi, null); // call method.Invoke
            il.Emit(OpCodes.Ret);                    // return the result

            s_InvokeMethod = (InvokeMethodDelegate)method.CreateDelegate(typeof(InvokeMethodDelegate));
        }