我使用GhostScriptSharp构建了一个转换器,通过网站生成PDF文件的整页图像,每当我调用GenerateOutput()时,gsdll32.dll似乎都会保持锁定状态(以及它生成/工作的文件)。 / p>
我的代码段:
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,以防因为某些原因它没有第一次出现,并且它抛出{{1} }。所以看起来API正常退出,只是IIS没有正确释放锁定我猜?
答案 0 :(得分:0)
经过更多研究,这似乎实际上是IIS和本机dll导入之间的行为。在大多数情况下,可以通过在发布之前卸载AppDomain(即循环应用程序池)来避免此问题。这在使用app_offline.htm的正常发布方案中是可行的,但在Azure持续集成环境中,这不是一个选项(这很难过,因为我必须禁用CI并在我的主分支上使用手动发布)。
关于我如何解决这个问题以进行自动化构建的任何进一步的输入将是非常有帮助的。我现在唯一的解决方法是将Ghostscript依赖关系卸载到一台单独的机器并设置一个消息队列来处理事物(呃)。