gpt4 book ai didi

.net - 确定是否正在使用 GAC 和 NGen 的程序集

转载 作者:行者123 更新时间:2023-12-04 00:53:37 26 4
gpt4 key购买 nike

我如何确定是否正在使用 native 图像,而加载程序没有在运行时验证程序集的签名,甚至使用 GAC 的程序集?

我有一个复杂的系统,我们正在用 NGen 进行试验,但目前我们正在从所有 DLL 所在的文件夹中运行 exe,因为有很多后期绑定(bind)依赖项,查看 Process Explorer,看起来 native 图像正在使用过,但我怎样才能确定我得到了全部好处并消除了加载程序验证步骤?

干杯,
格雷姆。

更新:
我从程序集绑定(bind)日志查看器中得到了很多这样的东西:

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

最佳答案

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

Assembly assembly = Assembly.GetExecutingAssembly();

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

编辑:找到了一种方法...

为了查看它是否是 NGEN'd,您必须直接读取程序集并查看 Precompile Header 字段是否具有根据 this page 的数据.我对达到这个值有点生疏,但应该这样做。我看不到通过反射方法来解决这个问题的方法。

关于.net - 确定是否正在使用 GAC 和 NGen 的程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2282397/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com