5

私は C# で作成された psp エミュレーターの作成者です。

ILGenerator を使用して多くの「DynamicMethod」を生成しています。アセンブリ コードを AST に変換してから、IL コードを生成し、その DynamicMethod をビルドしています。これを別のスレッドで行っているため、プログラムが他のスレッドを実行している間に新しいメソッドを生成できるため、スムーズに実行できます。

私の問題は、ネイティブ コードの生成が遅延しているため、IL が生成されたときではなく、関数が呼び出されたときにマシン コードが生成されることです。そのため、スレッドを実行するプログラムで生成されます。asm->ast->il の手順であるため、ネイティブ コードの生成はかなり遅くなります。

関数を実行する前にマシンコードを生成すると思われる Marshal.Prelink メソッドを試しました。Mono では動作しますが、MS .NET では動作しません。

Marshal.Prelink(MethodInfo);

MS .NET で DynamicMethod をプレリンクする方法はありますか?

関数にブール値のパラメーターを追加すると、設定されている場合はすぐに関数が終了するため、実際にはコードが実行されないと考えました。そのように「事前リンク」することもできますが、それは避けたい厄介な解決策だと思います.

何か案が?

4

2 に答える 2

0

動的メソッドへのデリゲートを作成すると JIT が強制されると誰かが言っているのを見つけました。

メソッドをターゲットとするデリゲートを作成します。これのポイントは何ですか?

これも有望に思えます:

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();
于 2012-12-01T04:59:05.980 に答える
0

なぜそれが機能しないのかに関する情報を読むと、MSDN ドキュメントには次のように書かれています::

プラットフォーム呼び出し以外のメソッドで Prelink を呼び出しても効果はありません。

restrictedskipverificationまたはを使用するskipverificationと、メソッドが jit されると確信しています。

私が間違っていたとしても、あなたの短絡的な考えは悪いものではありません.

于 2013-01-12T18:52:53.270 に答える