Path: blob/master/BizHawk.Emulation.Cores/ExternalCores/Snippets.txt
2 views
////////////////////////////1//we can't use these because we need more clever control over the delegate type (marshalling attributes, for one thing)23Delegate MyMakeDelegate(string methodName)4{5MethodInfo mi = GetType().GetMethod(methodName,BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);6var parameters = mi.GetParameters()7.Select(p => p.ParameterType)8.ToArray();910Type t = DelegateCreator.MakeNewCustomDelegate(mi.ReturnType, parameters);11return Delegate.CreateDelegate(t, this, mi);12}131415static class DelegateCreator16{17public static Type MakeNewCustomDelegate(Type ret_type, Type[] argtypes)18{19var _DelegateCtorSignature = new Type[] { typeof(object), typeof(IntPtr) };20Type returnType = ret_type;21Type[] parameterTypes = argtypes;22TypeBuilder builder = DefineDelegateType("Delegate" + argtypes.Length);23builder.DefineConstructor(MethodAttributes.RTSpecialName | MethodAttributes.HideBySig | MethodAttributes.Public, CallingConventions.Standard, _DelegateCtorSignature).SetImplementationFlags(MethodImplAttributes.CodeTypeMask);24builder.DefineMethod("Invoke", MethodAttributes.VtableLayoutMask | MethodAttributes.HideBySig | MethodAttributes.Virtual | MethodAttributes.Public, returnType, parameterTypes).SetImplementationFlags(MethodImplAttributes.CodeTypeMask);2526//[UnmanagedFunctionPointer(CallingConvention.ThisCall)]27//builder.SetCustomAttribute(new CustomAttributeBuilder(new ConstructorInfo(28ConstructorInfo ci = typeof(UnmanagedFunctionPointerAttribute).GetConstructor(new[] { typeof(CallingConvention) });29CustomAttributeBuilder cab = new CustomAttributeBuilder(ci, new object[] { CallingConvention.ThisCall });30builder.SetCustomAttribute(cab);3132return builder.CreateType();33}3435internal static TypeBuilder DefineDelegateType(string name)36{37return DefineType(name, typeof(MulticastDelegate), TypeAttributes.AutoClass | TypeAttributes.Sealed | TypeAttributes.Public);38}3940static int _index;41private static TypeBuilder DefineType(string name, Type parent, TypeAttributes attr)42{43StringBuilder builder = new StringBuilder(name);44int num = Interlocked.Increment(ref _index);45builder.Append("$");46builder.Append(num);47builder.Replace('+', '_').Replace('[', '_').Replace(']', '_').Replace('*', '_').Replace('&', '_').Replace(',', '_').Replace('\\', '_');48name = builder.ToString();49return _myModule.DefineType(name, attr, parent);50}5152static AssemblyBuilder _myAssembly;53static ModuleBuilder _myModule;54static void InitializeAssemblyGen()55{56AssemblyName name = new AssemblyName("Snippets");57CustomAttributeBuilder[] assemblyAttributes = new CustomAttributeBuilder[] { new CustomAttributeBuilder(typeof(SecurityTransparentAttribute).GetConstructor(Type.EmptyTypes), new object[0]) };58_myAssembly = AppDomain.CurrentDomain.DefineDynamicAssembly(name, AssemblyBuilderAccess.Run, assemblyAttributes);59_myModule = _myAssembly.DefineDynamicModule(name.Name, false);60_myAssembly.DefineVersionInfoResource();61}62static DelegateCreator()63{64InitializeAssemblyGen();65}66}676869////////////////70these are members of external core. theyre deprecated.717273public IntPtr Signal(string param, IntPtr value)74{75return mAccessor.Signal(null, IntPtr.Zero, param, value);76}7778public IntPtr Signal(string param)79{80return mAccessor.Signal(null, IntPtr.Zero, param, IntPtr.Zero);81}8283public IntPtr Signal(string type, IntPtr obj, string param, Delegate value)84{85liveDelegates[value.Target ?? ostatic][param] = value;86return mAccessor.Signal(type, obj, param, Marshal.GetFunctionPointerForDelegate(value));87}8889public IntPtr Signal(string param, Delegate value)90{91return Signal(null, IntPtr.Zero, param, value);92}9394public IntPtr Signal(string param, int value)95{96return mAccessor.Signal(null, IntPtr.Zero, param, new IntPtr(value));97}9899public IntPtr Signal(string type, IntPtr obj, string param, IntPtr value)100{101return mAccessor.Signal(type, obj, param, value);102}103104