我正在尝试让jmp操作码在Cil中工作
jmp void ILTest.Program::MyFunc2(int32)
ilasm很好用,但是当我运行程序时,我总是得到“公共语言运行时检测到无效程序”异常。
我知道这是无法验证的代码,所以我试图授予权限
SecurityPermission perm =
new SecurityPermission(SecurityPermissionFlag.Execution |
SecurityPermissionFlag.SkipVerification |
SecurityPermissionFlag.UnmanagedCode);
但它似乎没有任何效果。
有没有人使用'jmp'工作得到一个程序?
答案 0 :(得分:3)
jmp
只能跳转到与当前方法具有相同参数的方法。确保你已经在一个方法中将int32
作为参数,并且你没有任何东西被推入堆栈:它必须是空的。同时确保您不在try/catch/filter/finally
区块内。
如果您无法满足这些条件,请改用call
。
答案 1 :(得分:-1)
要记住的一件事是,所有程序集和动态方法都有自己的元数据标记集,用于引用其他方法,字段和类型。因此,当替换现有程序集的IL代码时,您只能使用已在该程序集中使用的标记(在其他类和方法中)。很可能在组装完成后你不能分配新的令牌。 (至少它是我的预感)
另外我认为有两种方式可以跳跃"从一个装配到另一个装配。一个是使用DynamicMethod.Invoke,另一个是预构建一个虚方法,并从它的IL代码中解析目标方法标记。在我的项目中,我最终需要两者,祝你好运。 :)
同样,在替换现有方法的IL代码时,您需要拥有足够大的" max stack"值,并以某种方式确保为您的新代码提供足够的局部变量。
不幸的是.net运行时异常非常通用,从不告诉你出了什么问题。因此,准备好拥有大量小型测试用例,以便通过各种方法测试您的解决方案。
这里还有一些有用的链接:
http://www.codeproject.com/Articles/14058/Parsing-the-IL-of-a-Method-Body
http://blogs.msdn.com/b/haibo_luo/archive/2006/11/07/turn-methodinfo-to-dynamicmethod.aspx