为什么签名的程序集加载缓慢?

我本周遇到一个奇怪的问题,我无法解释:我将我的应用程序切换为使用某些第三方程序集(Xceed Grid和其他一些组件)的签名版本,并且应用程序启动时间进入了厕所。 每次应用程序加载已签名的程序集时,都需要30秒才能加载。 应用程序启动从5秒到超过90秒。 这到底是怎么回事?!

其他一些信息:

  • 这是在.NET 3.5 SP1下运行的WinForms应用程序。
  • 计算机没有互联网连接(为了安全起见,故意)。

看看这些链接:

他们可能会帮忙。 可能是系统上的配置意味着.NET框架正在进行大量额外的工作来validation程序集。 如果是这种情况,那么您可以将其配置为不那么挑剔。

杰森埃文斯的post确实包含答案,但是以链接的forms。 我认为在这里发布实际的解决方案会很好:

在与可执行文件相同的文件夹中创建文件Appname.exe.config(其中Appname是可执行文件的名称;对于开发,这将在调试输出文件夹中)。 这显示了一个xml文件,假定您在主配置文件中没有其他条目; 如果你已经有了这个文件,我假设你只需要根据需要添加新的部分/文本:

      

只是因为其他人遇到这篇文章,我已经进一步追踪了这个问题,因为我只想弄清楚并找到了这个页面。

如果您的计算机上的现有CRL已超时,并且尚未使用新计算机更新,则每次运行进程时都会检查CRL。 您可以通过点击http://crl.microsoft.com/pki/crl/products/CodeSignPCA.crl上的CRL进行测试,并检查有效期。 现在在IE中配置不起作用的代理。 将您的机器日期设置为过期日期并重新测试您的应用程序。

如果禁用了NIC,则不会检查CRL。

如果您的NIC没有网关,则不会检查CRL。

如果启用了代理和网关,则会检查CRL,如果代理出现问题,则会遇到此超时。

如果您成功连接到互联网,那么CRL会更新,您暂时还可以。

我的应用程序在.NET 2.0中使用了一些较旧的Xceed组件,并且一直在工作,因此需要一段时间来弄清楚发生了什么。

加载已签名的程序集肯定会于非签名程序集,因为需要validation签名,但这应该完全可以忽略不计。

从5秒到90秒? 我想你需要联系大会作者并询问他们是否只更改了签名:-)

我猜你已经设置了安全设置,以便validation程序集证书。 因此,它可能会尝试访问Web以validation某些证书,然后等待超时(30秒是非常典型的超时数)。

如果您查看30秒内发生的情况,可以validation这一点。 因为我的猜测是真的,在90秒内应该有很少的CPU使用和很少的硬盘访问。 如果您的CPU使用率很高或受到硬盘绑定,那么它就是其他东西。

顺便说一句:另一种选择是如果你的硬盘已满,而且组件非常碎片(但在这种情况下90秒会比我听说过的多)。

尝试使用“Step over”从visual studio启动应用程序。 这将通过单步执行每个应用程序来启动代码,这样您就可以查看需要这么长时间的内容。 我曾经有过这个,事实certificate我的SQL服务器真的搞砸了。

另一种找出为什么需要这么长时间的方法是将断点分散在加载代码中,看看瓶颈是什么。 如果应用程序 第一次使用之前需要90秒,可能需要使用XCeed,或者加载已签名的程序集。

顺便说一句,我知道有更好的方法来分析你的应用程序,但这种快速的脏方法可以非常有效地调试这些问题

也许签名的程序集不是NGEN,而未签名的程序集是。