.net DynamicInfo调用方法

.net DynamicInfo调用方法,.net,debugging,dynamicmethod,.net,Debugging,Dynamicmethod,所以我在.NET中进行调试。 我正试图从dll调用一个带有DynamicILInfo的方法。 但我做错了什么 delegate void assinv1(); private static void insert() { MethodInfo entryPoint = AppDomain.CurrentDomain.Load(File.ReadAllBytes(@"method.dll")).EntryPoint; Type[] arg

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

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

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


解决这个问题的方法比简单的复制要复杂得多。您需要在原始程序集中查找元标记,并在您的执行上下文(当前程序集)中重新解释它。

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

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


解决这个问题的方法比简单的复制要复杂得多。您需要在原始程序集中查找元标记,并在您的执行上下文(当前程序集)中重新解释它。

代码是如何工作的?你有什么例外吗?如果是,您能发布整个异常吗?@Justus显示原始方法代码。我看不到您在all@svick我很抱歉没有任何信息的简短问题。我得到了这个异常:“公共语言运行库检测到一个无效的程序。”我也编辑了这个函数。我觉得你不仅仅是在试图调用一个方法,你还试图从另一个程序集创建一个方法的副本并调用它。你能解释一下原因吗?你不能仅仅使用反射(没有
动态方法
)来获取代理吗?代码怎么不起作用?你有什么例外吗?如果是,您能发布整个异常吗?@Justus显示原始方法代码。我看不到您在all@svick我很抱歉没有任何信息的简短问题。我得到了这个异常:“公共语言运行库检测到一个无效的程序。”我也编辑了这个函数。我觉得你不仅仅是在试图调用一个方法,你还试图从另一个程序集创建一个方法的副本并调用它。你能解释一下原因吗?你不能只使用反射(而不使用
DynamicMethod
)来获取代理吗?正如斯维克在评论中指出的,如果你只想调用一个代理,那么你应该使用反射。正如斯维克在评论中指出的,如果你只想调用一个代理,那么你应该使用反射。