第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 C# 中調(diào)用動態(tài)方法時如何傳遞 Struct 參數(shù)?

在 C# 中調(diào)用動態(tài)方法時如何傳遞 Struct 參數(shù)?

C#
RISEBY 2022-06-19 10:31:05
我在動態(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


查看完整回答
反對 回復(fù) 2022-06-19
  • 1 回答
  • 0 關(guān)注
  • 217 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號