我正在努力处理ngen和泛型集合。我已经在解决方案中生成了我的所有程序集,但每次我的应用程序执行该代码时,仍然会发生but:
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和泛型集合有什么问题吗?
发布于 2013-05-20 19:54:02
好吧,这不是问题。您通过使用jitCompilationStartMsg调试助手解决了这个问题。这只是简单地报告抖动已经开始。我们在您之前关于MDA的问题中讨论了这一点。
这是完全正常的,也是泛型在.NET中的工作方式,jitter在运行时从泛型类定义中生成具体的类。任何引用类型都有一个具体类的实例,代码中使用的每个值类型都有一个实例。
当然,这与Ngen不是很兼容,Dictionary<>是mscorlib.dll中的一个类,当您在机器上安装.NET时,该程序集已生成。Ngen无法预先猜测您将在代码中实例化哪些具体的类类型。在mscorlib.dll中有一个对策,它预定义了许多泛型类型,因此它们将被生成。像List<int>一样,很可能在应用程序中使用。以及.NET框架本身。
您可以从Reference Source, CommonlyUsedGenericInstantiations() method中看到这些预声明的泛型类型。注意,它在该方法中有几个预煮好的Dictionary<>版本。但not a Dictionary<int, bool>太不寻常了。因此,需要使用抖动来为您创建类型。
https://stackoverflow.com/questions/16647568
复制相似问题