0

我使用 GhostScriptSharp 构建了一个转换器,以通过网站生成 PDF 文件的整页图像,每当我调用 GenerateOutput() 时,gsdll32.dll 似乎保持锁定状态(以及它生成/工作的文件)。

我的代码片段:

GhostscriptSharp.GhostscriptWrapper.GenerateOutput(pdfFile, outputFile, settings);

调用此命令后,我立即将生成的字节保存到 Azure 上的 blob。完成后,我尝试致电:

try {
    File.Delete(outputFile); // clean up if we can
}
catch { }

这会引发异常,因为文件仍处于锁定状态。

然后,当我尝试再次构建(通过 F5 甚至在实时情况下)时,我收到一条错误消息,指出它无法将 gsdll32.dll 复制到我的 bin 文件夹,因为它已被锁定。

我对照Ghostscript API检查了 GhostScriptSharp ,似乎一切都以正确的顺序调用。不过,我无法解释为什么 IIS 会锁定 gsdll32.dll。

有人遇到过这个吗?我似乎找不到任何有类似问题的人。

更新:我尝试在上面的 catch 中第二次调用 ExitAPI/DeleteAPI,以防由于某种原因它没有第一次调用,并且它抛出了一个AccessViolationException. 所以看起来API正在正确退出,我猜只是IIS没有正确释放锁?

4

1 回答 1

0

经过更多研究,这似乎实际上是 IIS 和本机 dll 导入之间的行为。对于大多数目的,可以通过在发布前卸载 AppDomain(即循环应用程序池)来避免此问题。这在使用 app_offline.htm 的正常发布场景中是可行的,但在 Azure 持续集成环境中,这不是一个选项(这很遗憾,因为我不得不禁用 CI 并在我的主分支上求助于手动发布)。

关于如何解决这个问题以使构建自动化的任何进一步输入将非常有帮助。我现在唯一的解决方法是将 Ghostscript 依赖项卸载到单独的机器上,并设置一个消息队列来处理事情(呃)。

于 2015-02-19T14:10:45.407 回答