如何确定在未在运行时验证程序集的签名甚至使用GAC‘’ed程序集的情况下使用本机映像?
我有一个复杂的系统,我们正在试验NGen,但是目前我们正在运行所有DLL所在的文件夹中的exe,因为有很多后期的绑定依赖关系,在Process中,看起来使用的是本机映像,但是如何确定我得到了全部好处并消除了Loader验证步骤?
干杯,格雷姆。
更新:--我从程序集绑定日志查看器获得了很多这样的东西:
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.所以它使用的是本机映像,但仍然在验证它们,即不使用GAC版本,即使这是我创建本机映像的地方,比如:
ngen install "MyCompany.Entites, Version=2.0.0.0, Culture=neutral, PublicKeyToken=7cd8595f4671c5dd, processorArchitecture=MSIL"脚注:这篇文章似乎暗示,如果程序集不是从GAC加载的,那么验证过程将抵消NGen的优势?CLR内向外改进应用程序启动性能(MSDN)
更新-正如Nobugz在下面的评论中所指出的,自3.5SP1(参见:NGen上的MSDN文档)以来,不执行上述验证步骤。
发布于 2010-02-17 17:38:19
您可以从Fuslogvw.exe工具中轻松地看到它。从Visual命令提示符启动它。使用日志类别=本机映像、设置+日志将其配置为绑定到磁盘。运行你的程序。回到fuslogvw,Refresh它将显示已加载的所有程序集的列表。
双击一个条目以查看程序集是如何加载的。如果它来自GAC,你会看到:
日志:从C:\Windows\assembly\GAC_MSIL\blahblah加载的IL程序集
如果使用了Ngen-ed图像,您将看到:
日志:成功绑定到本机映像。
发布于 2010-02-17 16:35:25
您可以看到程序集是否很容易来自GAC:
Assembly assembly = Assembly.GetExecutingAssembly();
if (assembly.GlobalAssemblyCache)
{
Console.WriteLine("I'm in the GAC!");
}编辑:找到一种方法.
为了查看它是否是NGEN‘s,您必须直接读取程序集,并查看预编译头字段是否有与此页相同的数据。我在获得这个价值上有点生疏,但这应该可以做到。我看不出有什么办法可以通过反射方法来解决这个问题。
发布于 2016-10-17 13:16:25
您可以使用VMMAP。在那里,所有.dll (程序集)都有位置详细信息。
详细说明,如果您的程序集是从"C:\Windows\assembly\NativeImages(version)...“加载的因此,您的应用程序正在使用本机映像。
https://stackoverflow.com/questions/2282397
复制相似问题