为了账号安全,请及时绑定邮箱和手机立即绑定

在 C# 中调用动态方法时如何传递 Struct 参数?

在 C# 中调用动态方法时如何传递 Struct 参数?

C#
RISEBY 2022-06-19 10:31:05
我在动态方法中传递结构参数时遇到问题。这是我的代码:public class Program{    static void Main(string[] args)    {        var DynamicAssembly = new AssemblyName();        DynamicAssembly.Name = "DynamicTypes";        AssemblyBuilder ab = AssemblyBuilder.DefineDynamicAssembly(DynamicAssembly, AssemblyBuilderAccess.Run);        ModuleBuilder mb = ab.DefineDynamicModule(DynamicAssembly.Name);        TypeBuilder tb = mb.DefineType("Handler", TypeAttributes.Class | TypeAttributes.Public);        MethodBuilder handler = tb.DefineMethod($"DynamicHandler",            MethodAttributes.Public | MethodAttributes.Static,           typeof(void),           new Type[] { typeof(MyClass), typeof(MyStruct) });        var ProcessMethod = typeof(Program).GetMethod(nameof(Process));        ILGenerator il = handler.GetILGenerator();        il.Emit(OpCodes.Nop);        il.Emit(OpCodes.Ldarg_0);        il.Emit(OpCodes.Ldarg_1);        il.EmitCall(OpCodes.Call, ProcessMethod, null);        il.Emit(OpCodes.Nop);        il.Emit(OpCodes.Ret);        var DynamicType = tb.CreateType();        MethodInfo methodInfo = DynamicType.GetMethod("DynamicHandler");        int i = 100;        while (true)        {            i++;            MyClass a = new MyClass()            {                a = i,            };            MyStruct b = new MyStruct()            {                b = i,            };            methodInfo.Invoke(null, new object[] { a, b });            Thread.Sleep(3000);        }    }    public static void Process(object arg1, object arg2)    {        Console.WriteLine($"arg1:{arg1} arg2:{arg2}");    }}public struct MyStruct{    public int a;    public int b;}public class MyClass{    public int a;    public int b;}当我将代码运行到Process方法参数时,arg2发现“FatalExecutionEngineError”无法读取内存。但是,如果我将第二个参数更改为MyStruct喜欢    public static void Process(object arg1,MyStruct arg2)    {        Console.WriteLine($"arg1:{arg1} arg2:{arg2}");    }它工作正常,但这不是我想要的。我认为我的 IL 代码不正确,但我不知道它在哪里。
查看完整描述

1 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

您必须调用OpCodes.BoxonMyStruct才能将其作为object参数传递给方法。


你也不需要打电话OpCodes.Nop。所以基本上你的代码应该是这样的→


il.Emit(OpCodes.Ldarg_0);

il.Emit(OpCodes.Ldarg_1);

il.Emit(OpCodes.Box, typeof(MyStruct));

//Rest is the same


查看完整回答
反对 回复 2022-06-19
  • 1 回答
  • 0 关注
  • 186 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信