1

所以我在.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();
    }
    }
4

1 回答 1

0

您的方法的问题在于,您要复制的数组中的字节仅解析为在它们来自的程序集中有效的操作码。

调用方法的操作码不是指该方法的高级 MethodInfo,而是指元标记,该标记基本上是对该程序集特定的方法表的索引。即使是两次编译的原始源代码也可能导致不同的令牌值。

对此的解决方案比简单的副本要复杂得多。您需要在原始程序集中查找元标记并在执行上下文(当前程序集)中重新解释它。

于 2017-03-13T22:03:20.637 回答