如何 return Task.FromResult<bool>(true) 使用 mono cecil?
How to return Task.FromResult<bool>(true) using mono cecil?
我需要用mono cecil来实现下面的逻辑。
public Task<bool> MyTask()
{
return Task.FromResult<bool>(true);
}
我只知道如何调用非泛型方法,因为cecil项目中有相应的demo代码。我不知道如何调用泛型方法。谁能告诉我该怎么做?相应的 IL 代码应该是这样的:
ldc.i4.1
调用 class [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));
}
}
}
}
}
你需要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));
我需要用mono cecil来实现下面的逻辑。
public Task<bool> MyTask()
{
return Task.FromResult<bool>(true);
}
我只知道如何调用非泛型方法,因为cecil项目中有相应的demo代码。我不知道如何调用泛型方法。谁能告诉我该怎么做?相应的 IL 代码应该是这样的:
ldc.i4.1 调用 class [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));
}
}
}
}
}
你需要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));