我有一个命令行进程,它使用 ABCpdf 从 HTML 文件创建 PDF 文件。我正在尝试从 v5(非常旧,不再受支持)升级到 v8,但是在安装 ABCpdf 8 并更新我的应用程序以使用新的 DLL 之后,我注意到过去转换过程只需要不到一秒的时间现在需要 20 多秒。
我在代码中添加了一些跟踪调用,看起来程序尝试从 ABCpdf 8 DLL 引用对象的地方是暂停很长时间的地方。一旦代码超过该点,它就会像以往一样快速运行。
我的问题是:什么会导致 CLR 在尝试引用第 3 方库时速度如此之慢?我已验证 ABCpdf 8 DLL 位于 GAC 中,并且与可执行文件位于同一目录中。
提前致谢。
最佳答案
我猜猜:
您正在没有(传出)互联网连接的服务器上运行它。
该组件具有强名称并使用加密 key 签名。正在检查证书(检查吊销列表是否证书仍然有效和可信)。由于没有互联网连接而超时。
如果您想确认这一点,请附加调试器(WinDbg?)并在任何线程上确认以下堆栈跟踪:
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 :
哦,那个页面没有(明确地)链接到解决方案:
关于c# - 第 3 方程序集加载缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9166192/