所以我在.NET中进行调试。 我试图从一个DLL调用DynamicILInfo的方法。 但是我做错了什么?
delegate void assinv1();
private static void insert()
{
MethodInfo entryPoint = AppDomain.CurrentDomain.Load(File.ReadAllBytes(@"method.dll")).EntryPoint;
Type[] args = new Type[] { typeof(string[]) };
DynamicMethod dm = new DynamicMethod("assinv", null, null);
DynamicILInfo dynamicILInfo = dm.GetDynamicILInfo();
SignatureHelper localVarSigHelper = SignatureHelper.GetLocalVarSigHelper();
localVarSigHelper.AddArguments(args, null, null);
dynamicILInfo.SetLocalSignature(localVarSigHelper.GetSignature());
dynamicILInfo.SetCode(entryPoint.GetMethodBody().GetILAsByteArray(), entryPoint.GetMethodBody().MaxStackSize);
assinv1 d1 = dm.CreateDelegate(typeof(assinv1)) as assinv1;
d1();
}
}
答案 0 :(得分:0)
您的方法的问题是您要复制的数组中的字节仅解析为在它们来自的程序集中有效的操作码。
对方法调用的操作码不是指该方法的高级MethodInfo,而是引用元标记,该元标记基本上是特定于该程序集的方法表的索引。即使是两次编译的原始源代码也可能导致不同的令牌值。
解决方案比简单复制要复杂得多。您需要在原始程序集中查找元令牌,并在执行上下文(当前程序集)中重新解释它。