我正在努力研究ngen和泛型集合。我已经在解决方案中使用了所有程序集,但是每当我的应用程序执行该代码时,仍会以某种方式进行jitting:
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和泛型集合是否存在一些问题?
答案 0 :(得分:9)
嗯,这不是问题。您使用jitCompilationStartMsg调试助手使问题成为问题。这只是报告抖动开始了。我们在您之前关于该MDA的问题中对此进行了讨论。
这是完全正常的,以及泛型在.NET中的工作方式。抖动在运行时从通用cookie-cutter类定义生成具体类。 任何引用类型将具有一个具体类的实例,并且对于您在代码中使用的每个值类型都有一个实例。
这当然与Ngen不太相容,Dictionary&lt;&gt;是mscorlib.dll中的一个类,当您在计算机上安装.NET时,该程序集已被编译。 Ngen无法预测您将在代码中实例化的具体类类型。在mscorlib.dll中有一个对策,它预先定义了许多泛型类型,因此它们将被添加。与List<int>
一样,很可能在应用程序中使用。在.NET框架本身。
您可以在Reference Source, CommonlyUsedGenericInstantiations() method中看到这些预先声明的泛型类型。请注意它是如何有几个预煮的版本的Dictionary&lt;&gt;在那种方法中。但不一个Dictionary<int, bool>
,太不寻常了。因此需要为您创建类型的抖动。