2012-12-01 27 views
5

我是用C#制作的psp模拟器的作者。DynamicMethod预链接

我使用ILGenerator生成大量的“DynamicMethod”。我将汇编代码转换为AST,然后生成IL代码并构建DynamicMethod。我在另一个线程中这样做,所以我可以在程序执行其他程序时生成新的方法,以便它可以顺利运行。

我的问题是本机代码的生成是懒惰的,因此机器码是在函数调用时生成的,而不是在生成IL时生成的。因此,它在程序执行线程中生成,本地代码生成速度慢,因为它是asm-> ast-> il步骤。

我试过了Marshal.Prelink方法,它被用来在执行函数之前生成机器码。它在Mono上工作,但它不适用于MS .NET。

Marshal.Prelink(MethodInfo); 

是否有一种方法可以预先链接MS .NET上的DynamicMethod?

我想加入一个布尔参数给函数,如果设置,立即退出函数,所以没有代码实际执行。我可以以这种方式“预先链接”,但我认为这是我想避免的一个讨厌的解决方案。

有什么想法?

回答

0

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(); 
+1

我真的不明白为什么会创建一个委托强制JIT。第二种方法应该与CER(受限执行区域)一起使用,但不确定这是否正确。 – svick

0

读取信息,为什么它不工作的MSDN文档说以下::

平台调用的外面的方法调用预链接没有任何效果。

我很安静地相信,如果您使用restrictedskipverificationskipverification它将jit的方法。

虽然如果我错了,你的短路理念并不坏。