2012-12-01 58 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的方法。

雖然如果我錯了,你的短路理念並不壞。