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

时间:2009-10-24 17:42:54

标签: c# .net signed-assembly

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

其他一些信息:

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

7 个答案:

答案 0 :(得分:17)

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

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

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <runtime>
        <generatePublisherEvidence enabled="false" />
    </runtime>
</configuration>

答案 1 :(得分:15)

看看这些链接:

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

答案 2 :(得分:3)

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

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

如果您的NIC被禁用,则不会检查CRL。

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

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

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

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

答案 3 :(得分:1)

加载已签名的程序集肯定会比未签名的程序集慢,因为需要验证签名,但这应该完全可以忽略不计。

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

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:1)

尝试使用“Step over”从visual studio启动应用程序。这将通过单步执行每个应用程序来启动代码,因此您可以检查需要这么长时间。我曾经有过这个,结果发现我的sql server真的搞砸了。

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

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

答案 6 :(得分:0)

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