gpt4 book ai didi

c# - 如何在 MSIL 中调用执行程序集之外的方法?

转载 作者:行者123 更新时间:2023-12-04 08:34:00 25 4
gpt4 key购买 nike

我可以访问这样的函数体中间语言:

byte[] ilCodes = NestedFooInfo.GetMethodBody().GetILAsByteArray();
我可以修改它的 IL 代码,以便在执行方法体之前调用以下名为 OnChangeField 的方法。 :
public static void OnChangeField()
{
Console.WriteLine("VICTORY");
return;
}
到目前为止,我是这样做的:
我定义了我想调用的方法的调用指令:
MethodInfo OnStfld = typeof(MethodBoundaryAspect).GetMethod("OnChangeField");
byte[] callIL = new byte[5];
callIL[0] = (byte)OpCodes.Call.Value;
callIL[1] = (byte)(OnStfld.MetadataToken & 0xFF);
callIL[2] = (byte)(OnStfld.MetadataToken >> 8 & 0xFF);
callIL[3] = (byte)(OnStfld.MetadataToken >> 16 & 0xFF);
callIL[4] = (byte)(OnStfld.MetadataToken >> 24 & 0xFF);
请注意 OnChangeField 位于 MethodBoundaryAspect 类中。此类位于正在编辑的方法程序集之外。
这就是我改变原始( NestedFoo(...) )方法体的方式:
byte[] ilCodes = NestedFooInfo.GetMethodBody().GetILAsByteArray();
InjectionHelper.UpdateILCodes(NestedFooInfo, callIL.Concat(ilCodes).ToArray());
我得到一个:

System.BadImageFormatException: 'Index not found. (Exception from HRESULT: 0x80131124)'


但前提是 Hook 方法 OnChangeField在执行程序集之外(或者我理解)。如果我搬家 OnChangeField在与 NestedFoo 相同的类中或在 NestedFoo 的另一个类中的组装,它完美地工作。
我知道元数据 token 指向无效的内存位置。有没有办法改变它?
这里的引用是:
更改后的方法的方法体如下所示:
public class ExceptionHandlingService : IExceptionHandlingService
{
public static string var1 = "initialValue";
public static string Var2 { get; set; } = "initialValue";
public string var3 = "initialValue";
public string Var4 { get; set; } = "initialValue";

public string NestedFoo(SampleClass bar)
{
var1 = "value set in NestedFoo()";
Var2 = "value set in NestedFoo()";
var3 = "value set in NestedFoo()";
Var4 = "value set in NestedFoo()";
AddPerson("From", "NestedFoo", 2);
return Foo();
}
[...]
}
以及我如何调用改变的方法:
var a = new ExceptionHandlingService();
var b = new SampleClass("bonjour", 2, 3L); // Not really relevant
a.NestedFoo(b);
对于那些想知道魔法发生的人 InjectionHelper.UpdateILCodes(NestedFooInfo, newIlCodes);您可以查看 this link它显示了如何在运行时编辑 Il 代码。

最佳答案

您需要添加记录到MemberRef并连续 TypeRefTypeSpec元数据表包含对类型的引用并引用这些标记。这还涉及正确编写签名 blob。
参见 ECMA-335 的第 II 部分 22.38、22.25

关于c# - 如何在 MSIL 中调用执行程序集之外的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64891113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com