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)); }
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)); }