Ejemplo n.º 1
0
        public static MethodInfo WrapInterop(MethodInfo transpiler)
        {
            lock (Wrappers)
            {
                if (Wrappers.TryGetValue(transpiler, out var wrapped))
                {
                    return(wrapped);
                }
            }

            using (var dmd = new DynamicMethodDefinition($"TranspilerWrapper<{transpiler.GetID(simple: true)}>",
                                                         typeof(IEnumerable <CodeInstruction>), new[]
            {
                typeof(IEnumerable <CodeInstruction>),
                typeof(ILGenerator),
                typeof(MethodBase)
            }))
            {
                var il = dmd.GetILGenerator();
                il.Emit(OpCodes.Ldtoken, transpiler);
                il.Emit(OpCodes.Call, ResolveToken);
                il.Emit(OpCodes.Castclass, typeof(MethodInfo));
                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Ldarg_1);
                il.Emit(OpCodes.Ldarg_2);
                il.Emit(OpCodes.Call, ApplyTranspilerMethod);
                il.Emit(OpCodes.Ret);

                var generatedWrapper = dmd.GenerateWith <DMDCecilGenerator>();

                lock (Wrappers)
                {
                    Wrappers[transpiler] = generatedWrapper;
                }

                return(generatedWrapper);
            }
        }