确定GAC是否&正在使用NGen'ed组件

时间:2010-02-17 16:25:09

标签: .net ngen

如何在没有Loader在运行时验证程序集的签名,甚至使用GAC的程序集的情况下确定是否正在使用Native映像?

我有一个复杂的系统,我们正在试验NGen但是目前我们正在运行来自所有DLL所在的文件夹的exe由于很多后期绑定依赖性,看着Process Explorer,它看起来像Native正在使用图像,但我怎样才能确定我获得了全部好处并取消了Loader Verification步骤?

干杯, 格雷姆。

更新 我从Assembly Binding Log查看器中得到了很多这样的东西:

LOG: [Level 1]Start validating IL dependency MyCompany.Entities, Version=2.0.0.0, Culture=neutral, PublicKeyToken=7cd8595f4671c5dd.
LOG: Dependency evaluation succeeded.

并在最后

LOG: Validation of dependencies succeeded.
LOG: Start loading all the dependencies into load context.
LOG: Loading of dependencies succeeded.
LOG: Bind to native image succeeded.
Native image has correct version information.
Attempting to use native image C:\Windows\assembly\NativeImages_v2.0.50727_32\MyCompany.Mylibrary#\4710bb8309419d707681bd360088181f\MyCompany.MyLibrary.MyClass.ni.dll.
ZAP: Native image has been relocated.
Native image successfully used.

所以它正在使用Native图像但仍在验证它们,即不使用GAC版本,即使这是我创建Native图像的地方,如下所示:

ngen install "MyCompany.Entites, Version=2.0.0.0, Culture=neutral, PublicKeyToken=7cd8595f4671c5dd, processorArchitecture=MSIL"

脚注: 这篇文章似乎暗示如果组件没有从GAC加载,那么验证过程将抵消NGen的优势? CLR Inside Out - Improving Application Startup Performance (MSDN)

更新 - 正如Nobugz在下面的评论中指出的那样,自3.5 SP1以来,上述验证步骤未执行:MSDN Docs on NGen

3 个答案:

答案 0 :(得分:12)

您可以从Fuslogvw.exe工具轻松查看。从Visual Studio命令提示符启动它。使用日志类别配置它=本机映像,设置+日志所有绑定到磁盘。运行你的程序。回到fuslogvw,刷新。它将显示已加载的所有程序集的列表。

双击条目以查看程序集的加载方式。如果它来自GAC,您会看到:

  

日志:IL程序集从C:\ Windows \ assembly \ GAC_MSIL \ blahblah

加载

如果使用了Ngen-ed图像,您会看到:

  

日志:绑定到原生图像成功。

答案 1 :(得分:2)

您可以很容易地看到程序集是否来自GAC:

Assembly assembly = Assembly.GetExecutingAssembly();

if (assembly.GlobalAssemblyCache)
{
    Console.WriteLine("I'm in the GAC!");
}

编辑:找到方法......

为了查看它是否为NGEN,您必须直接读取程序集,并查看预编译头字段是否具有this page的数据。达到这个价值我有点生疏,但应该这样做。我没有看到通过反射方法弄明白的方法。

答案 2 :(得分:1)

您可以使用VMMAP。在那里,所有.dll(程序集)都有位置详细信息

详细说明如何从" C:\ Windows \ assembly \ NativeImages(版本)..."加载程序集。所以你的应用程序正在使用原生图像。

相关问题