0

GhostScriptSharp を使用してコンバーターを作成し、Web サイト経由で 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 のロックを保持している理由を説明することはできません。

誰もこれに遭遇しましたか?同様の問題を抱えている人を見つけることができないようです。

更新:何らかの理由で最初に時間がかからなかった場合に備えて、上記のキャッチで ExitAPI/DeleteAPI をもう一度呼び出してみましたが、AccessViolationException. API が適切に終了しているように見えますが、IIS がロックを適切に解放していないのではないでしょうか?

4

1 に答える 1

0

さらに調査した結果、これは実際には IIS とネイティブ dll インポート間の動作であると思われます。ほとんどの場合、公開前に AppDomain をアンロードする (つまり、アプリケーション プールを循環させる) ことで、この問題を回避できます。これは、app_offline.htm を使用した通常の発行シナリオでは可能ですが、Azure 継続的インテグレーション環境では、これはオプションではありません (CI を無効にし、マスター ブランチで手動発行に頼る必要があったため、これは悲しいことです)。

これを回避してビルドを自動化する方法についてさらに情報があれば、非常に役に立ちます。私が現在持っている唯一の回避策は、Ghostscript の依存関係を別のマシンにオフロードし、メッセージ キューを設定して処理することです (うーん)。

于 2015-02-19T14:10:45.407 に答える