1

ngen とジェネリック コレクションに苦労しています。ソリューション内のすべてのアセンブリを ngen しましたが、アプリがそのコードを実行するたびに何らかの形でジッティングが発生します。

private Dictionary<int, bool> VerifyedFunc; 

public SecurityProvider()
{
    ...
    VerifyedFunc = new Dictionary<int, bool>();
    ...       
}

MDA メッセージ:

Managed Debugging Assistant 'JitCompilationStart' has detected a problem in '*.exe'.
Additional Information: 
<mda:msg xmlns:mda="http://schemas.microsoft.com/CLR/2004/10/mda">
<mda:jitCompilationStartMsg break="true">
<method name="mscorlib!System.Collections.Generic.Dictionary`2::.ctor"/>
</mda:jitCompilationStartMsg>
</mda:msg>

NGen とジェネリック コレクションに問題はありますか?

4

1 に答える 1

9

まあ、これは問題ではありません。jitCompilationStartMsg デバッグ アシスタントを使用して問題を発生させました。これは単にジッターが始まったことを報告するだけです。これについては、その MDA に関する以前の質問で説明しました。

それ以外の場合、これは完全に正常であり、ジェネリックが .NET で機能する方法です。ジッターは、実行時に一般的なクッキーカッター クラス定義から具象クラスを生成します。任意の参照型に対して 1 つの具象クラスのインスタンスがあり、コードで使用するすべての値型に対してそれぞれ 1 つのインスタンスがあります。

もちろん、これはNgenとあまり互換性がありません.Dictionary<>はmscorlib.dllのクラスであり、マシンに.NETをインストールしたときにアセンブリがngen化されました。Ngen は、コードでインスタンス化しようとしている具体的なクラス タイプを前もって推測することはできません。mscorlib.dll にはこれに対する対策があり、多数のジェネリック型が事前に定義されているため、それらは ngen 化されます。のようList<int>に、アプリケーションで使用される可能性が非常に高いです。そして、.NET フレームワーク自体で。

これらの事前宣言されたジェネリック型は、リファレンス ソースの CommonlyUsedGenericInstantiations() メソッドから確認できます。そのメソッドに Dictionary<> のいくつかの事前に調理されたバージョンがあることに注意してください。しかし、あまりにも珍しいことではありません。Dictionary<int, bool>したがって、タイプを作成するにはジッターが必要です。

于 2013-05-20T11:54:02.307 に答える