//////////////////////////// //we can't use these because we need more clever control over the delegate type (marshalling attributes, for one thing) Delegate MyMakeDelegate(string methodName) { MethodInfo mi = GetType().GetMethod(methodName,BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); var parameters = mi.GetParameters() .Select(p => p.ParameterType) .ToArray(); Type t = DelegateCreator.MakeNewCustomDelegate(mi.ReturnType, parameters); return Delegate.CreateDelegate(t, this, mi); } static class DelegateCreator { public static Type MakeNewCustomDelegate(Type ret_type, Type[] argtypes) { var _DelegateCtorSignature = new Type[] { typeof(object), typeof(IntPtr) }; Type returnType = ret_type; Type[] parameterTypes = argtypes; TypeBuilder builder = DefineDelegateType("Delegate" + argtypes.Length); builder.DefineConstructor(MethodAttributes.RTSpecialName | MethodAttributes.HideBySig | MethodAttributes.Public, CallingConventions.Standard, _DelegateCtorSignature).SetImplementationFlags(MethodImplAttributes.CodeTypeMask); builder.DefineMethod("Invoke", MethodAttributes.VtableLayoutMask | MethodAttributes.HideBySig | MethodAttributes.Virtual | MethodAttributes.Public, returnType, parameterTypes).SetImplementationFlags(MethodImplAttributes.CodeTypeMask); //[UnmanagedFunctionPointer(CallingConvention.ThisCall)] //builder.SetCustomAttribute(new CustomAttributeBuilder(new ConstructorInfo( ConstructorInfo ci = typeof(UnmanagedFunctionPointerAttribute).GetConstructor(new[] { typeof(CallingConvention) }); CustomAttributeBuilder cab = new CustomAttributeBuilder(ci, new object[] { CallingConvention.ThisCall }); builder.SetCustomAttribute(cab); return builder.CreateType(); } internal static TypeBuilder DefineDelegateType(string name) { return DefineType(name, typeof(MulticastDelegate), TypeAttributes.AutoClass | TypeAttributes.Sealed | TypeAttributes.Public); } static int _index; private static TypeBuilder DefineType(string name, Type parent, TypeAttributes attr) { StringBuilder builder = new StringBuilder(name); int num = Interlocked.Increment(ref _index); builder.Append("$"); builder.Append(num); builder.Replace('+', '_').Replace('[', '_').Replace(']', '_').Replace('*', '_').Replace('&', '_').Replace(',', '_').Replace('\\', '_'); name = builder.ToString(); return _myModule.DefineType(name, attr, parent); } static AssemblyBuilder _myAssembly; static ModuleBuilder _myModule; static void InitializeAssemblyGen() { AssemblyName name = new AssemblyName("Snippets"); CustomAttributeBuilder[] assemblyAttributes = new CustomAttributeBuilder[] { new CustomAttributeBuilder(typeof(SecurityTransparentAttribute).GetConstructor(Type.EmptyTypes), new object[0]) }; _myAssembly = AppDomain.CurrentDomain.DefineDynamicAssembly(name, AssemblyBuilderAccess.Run, assemblyAttributes); _myModule = _myAssembly.DefineDynamicModule(name.Name, false); _myAssembly.DefineVersionInfoResource(); } static DelegateCreator() { InitializeAssemblyGen(); } } //////////////// these are members of external core. theyre deprecated. public IntPtr Signal(string param, IntPtr value) { return mAccessor.Signal(null, IntPtr.Zero, param, value); } public IntPtr Signal(string param) { return mAccessor.Signal(null, IntPtr.Zero, param, IntPtr.Zero); } public IntPtr Signal(string type, IntPtr obj, string param, Delegate value) { liveDelegates[value.Target ?? ostatic][param] = value; return mAccessor.Signal(type, obj, param, Marshal.GetFunctionPointerForDelegate(value)); } public IntPtr Signal(string param, Delegate value) { return Signal(null, IntPtr.Zero, param, value); } public IntPtr Signal(string param, int value) { return mAccessor.Signal(null, IntPtr.Zero, param, new IntPtr(value)); } public IntPtr Signal(string type, IntPtr obj, string param, IntPtr value) { return mAccessor.Signal(type, obj, param, value); }