1

我正在为 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 中的工作方式。抖动在运行时从通用 cookie-cutter 类定义生成具体类。任何引用类型都会有一个具体类的实例,而您在代码中使用的每种值类型都会有一个实例。

当然,这与 Ngen 不太兼容,Dictionary<> 是 mscorlib.dll 中的一个类,并且当您在计算机上安装 .NET 时,该程序集是经过 ngen 编辑的。Ngen 无法预先猜测您将在代码中实例化哪些具体的类类型。在 mscorlib.dll 中有一个对策,它预先定义了许多泛型类型,因此它们将被 ngen-ed。像List<int>,很可能在应用程序中使用。并且在 .NET 框架本身中。

您可以从参考源 CommonlyUsedGenericInstantiations() 方法中看到这些预先声明的泛型类型。请注意它在该方法中如何具有多个预编译的 Dictionary<> 版本。但不是一个Dictionary<int, bool>,太不寻常了。因此需要抖动来为您创建类型。

于 2013-05-20T11:54:02.307 回答