我是一个用C#制作的psp模拟器的作者。
我正在使用ILGenerator生成大量的"DynamicMethod“。我正在将汇编代码转换为AST,然后生成IL代码并构建该DynamicMethod。我在另一个线程中这样做,所以我可以在程序执行其他方法的同时生成新的方法,这样它就可以顺利地运行。
我的问题是本机代码生成是惰性的,所以机器代码是在调用函数时生成的,而不是在生成IL时生成的。所以它在程序执行线程中生成,本机代码生成非常慢,因为它是asm->ast->il步骤。
我已经尝试了Marshal.Prelink方法,该方法建议在执行函数之前生成机器码。它可以在单声道上工作,但不能在MS .NET上工作。
Marshal.Prelink(MethodInfo);有没有办法在MS .NET上预链接到DynamicMethod?
我想向函数添加一个布尔参数,如果设置了这个参数,就会立即退出函数,这样实际上就不会执行任何代码。我可以通过这种方式“预链接”,但我认为这是一个我想要避免的糟糕的解决方案。
有什么想法吗?
发布于 2012-12-01 12:59:06
I found someone saying that creating a delegate to the dynamic method would force JIT:
创建一个以方法为目标的委托。这有什么意义呢?
This one sounds promising too:
Thread jitter = new Thread(() =>
{
foreach (var type in Assembly.Load("MyHavyAssembly, Version=1.8.2008.8," +
" Culture=neutral, PublicKeyToken=8744b20f8da049e3").GetTypes())
{
foreach (var method in type.GetMethods(BindingFlags.DeclaredOnly |
BindingFlags.NonPublic |
BindingFlags.Public | BindingFlags.Instance |
BindingFlags.Static))
{
System.Runtime.CompilerServices.RuntimeHelpers.PrepareMethod(method.MethodHandle);
}
}
});
jitter.Priority = ThreadPriority.Lowest;
jitter.Start();发布于 2013-01-13 02:52:53
阅读MSDN文档中有关其无法工作的原因的信息时,会得出以下结论:
在平台调用之外的方法上调用预链接没有任何效果。
我非常确信,如果你使用restrictedskipverification或skipverification,它就会破坏你的方法。
不过,如果我错了,你的短路想法还不错。
https://stackoverflow.com/questions/13655402
复制相似问题