我有一个命令行过程,可以使用ABCpdf从HTML文件创建PDF文件。我正在尝试从v5(非常旧,不再受支持)升级到v8,但是在安装ABCpdf 8并更新了我的应用程序以使用新的DLL之后,我注意到该过程过去不到一秒钟即可完成转换现在需要20秒钟以上。

我在代码中添加了一些跟踪调用,看来该程序尝试从ABCpdf 8 DLL引用对象的地方是事物停顿了很长时间的地方。一旦代码超过了这一点,它就会以前所未有的速度运行。

我的问题是:当尝试引用第三方库时,是什么会导致CLR减慢太多?我已验证ABCpdf 8 DLL在GAC中以及与可执行文件相同的目录中。

提前致谢。

最佳答案

让我猜测一下:

您正在没有(传出)互联网连接的服务器上运行此程序。

该组件经过强命名,并使用加密 key 签名。正在检查证书(检查吊销列表是否证书仍然有效且受信任)。由于没有互联网连接,此超时。

如果要确认这一点,请附加调试器(WinDbg?)并在任何线程上确认以下stacktrace:

0e82c1b4 7c822124 ntdll!KiFastSystemCallRet
0e82c1b8 77e6bad8 ntdll!NtWaitForSingleObject+0xc
0e82c228 73ca64ec kernel32!WaitForSingleObjectEx+0xac
0e82c254 73ca6742 cryptnet!CryptRetrieveObjectByUrlWithTimeout+0x12f

对于Windows服务器版本,已经有一个Service Pack版本,默认情况下已启用检查功能,此版本已将其破坏。您可以使用注册表设置禁用它。

参见ASP.NET Hang: Authenticode signed assemblies:

哦,该页面没有(显然)链接到解决方案:
  • <generatePublisherEvidence> Element
  • FIX: A .NET Framework 2.0 managed application that has an Authenticode signature takes longer than usual to start
  • 09-27 14:50