【问题标题】:How to return Task.FromResult<bool>(true) using mono cecil?如何使用 mono cecil 返回 Task.FromResult<bool>(true)?
【发布时间】:2021-06-20 16:24:39
【问题描述】:

我需要使用mono cecil来实现以下逻辑。

public Task<bool> MyTask()
{
    return Task.FromResult<bool>(true);
}

我只知道如何调用非泛型方法,因为cecil项目中有对应的demo代码。我不知道如何调用泛型方法。谁能告诉我该怎么做?对应的 IL 代码应该是这样的:

ldc.i4.1 调用类 [mscorlib]System.Threading.Tasks.Task`1 [mscorlib]System.Threading.Tasks.Task::FromResult(!!0) 回复

这就是我现在拥有的:

void Main()
{
    AssemblyDefinition asm = AssemblyDefinition.ReadAssembly(@"F:\files.fm\Code\asm_wrangler\asm_wrangler\bin\Debug\a.exe");

    MethodInfo writeLineMethod = typeof(Debug).GetMethod("WriteLine", new Type[] { typeof(string) });
    MethodReference writeLine = asm.MainModule.Import(writeLineMethod);

    foreach (ModuleDefinition module in asm.Modules)
    {
        foreach (TypeDefinition type in module.Types)
        {
            foreach (var method in type.Methods)
            { 
                if (method.Name == "MyTask")
                {
                    var ins = method.Body.Instructions;
                    ins.Clear();
                    ILProcessor processor = method.Body.GetILProcessor();
                    
                    ins.Add(processor.Create(OpCodes.Ldc_I4_1));
                    
                    // ===> How to invoke Task.FromResult<bool>(true) here?
                    
                    ins.Add(processor.Create(OpCodes.Ret));
                }
            }
        }
    }
}

【问题讨论】:

    标签: c# generics mono.cecil


    【解决方案1】:

    你需要MakeGenericMethod,然后你可以像其他任何方法一样调用它

    var ins = method.Body.Instructions;
    
    ILProcessor processor = method.Body.GetILProcessor();
                        
    ins.Add(processor.Create(OpCodes.Ldc_I4_1));
    ins.Add(processor.Create(OpCodes.Call,
        typeof(Task).GetMethod("FromResult").MakeGenericMethod(typeof(bool)))
    ins.Add(processor.Create(OpCodes.Ret));
    

    【讨论】:

      猜你喜欢
      • 2021-07-05
      • 2012-06-19
      • 2015-05-14
      • 1970-01-01
      • 2011-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多