我在動態(tài)方法中傳遞結(jié)構(gòu)參數(shù)時遇到問題。這是我的代碼: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;}當(dāng)我將代碼運(yùn)行到Process方法參數(shù)時,arg2發(fā)現(xiàn)“FatalExecutionEngineError”無法讀取內(nèi)存。但是,如果我將第二個參數(shù)更改為MyStruct喜歡 public static void Process(object arg1,MyStruct arg2) { Console.WriteLine($"arg1:{arg1} arg2:{arg2}"); }它工作正常,但這不是我想要的。我認(rèn)為我的 IL 代碼不正確,但我不知道它在哪里。
1 回答
回首憶惘然
TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個贊
您必須調(diào)用OpCodes.BoxonMyStruct才能將其作為object參數(shù)傳遞給方法。
你也不需要打電話OpCodes.Nop。所以基本上你的代碼應(yīng)該是這樣的→
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldarg_1);
il.Emit(OpCodes.Box, typeof(MyStruct));
//Rest is the same
- 1 回答
- 0 關(guān)注
- 217 瀏覽
添加回答
舉報(bào)
0/150
提交
取消
