【问题标题】:gsdll32.dll stays locked after API delete/exitAPI 删除/退出后 gsdll32.dll 保持锁定状态
【发布时间】:2015-02-13 22:12:54
【问题描述】:

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

我的代码sn-p:

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

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

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

由于文件仍处于锁定状态而引发异常。

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

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

以前有人遇到过这种情况吗?我似乎找不到有类似问题的人。

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

【问题讨论】:

    标签: ghostscript ghostscriptsharp


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 2013-01-24
      • 2012-07-03
      • 2013-11-26
      相关资源
      最近更新 更多