2017-08-09 4 views
0

私のサーバー(IIS 8を実行しているWindows Server 2012)で実行されているvb.netで構築されたWebアプリケーションプロジェクトを継承しました。プロジェクトは私の会社が別のプロジェクトでビルドしたいくつかの.dllライブラリに依存し、エラーメッセージを.txtファイルに出力します。このプロジェクトの主な構造は、もはや私の会社ではない以前のプログラマーによって設定されました。私は必要なときに新しい.dllを追加するためにいくつかのコピー・ペースト・コードが与えられましたが、それはどういう形で実際に私に説明されたのではなく、コメントやその他のものには実際には書かれていません。プログラムの終了後にファイルを解放する

私は、プロジェクトの実行をトリガーすると、プログラムの実行が終了してから(Windowsはファイルがまだ使用中であることを知らせるまで)呼び出された.dllファイルまたは.txtファイルを削除できないことを発見しました。 )。私は、これらのファイルを使用していたプロセスが完了するとすぐに、このファイルをリリースすることを期待していました。私は、サーバー上のライブ環境で実行しているときと、ローカルマシン(Windows 10)でデバッグしているときの両方で、この動作に気付きました。

これは夫婦関連の質問に私をリード:

  • ファイルは、すぐにプロセスがそれらを使用して終了したとしてリリースされていない場合、彼らはリリースされていますか?
  • プロジェクトがサーバー上で実行されているときに、2人のユーザーが同じ.dllにアクセスしようとしたり、同時に.txtファイルに書き込もうとしたらどうなりますか?
  • .dllが強制的に実行され、指定されたポイントでその.dllが解放されるようにするために、私の.dll呼び出しの後にプロジェクトに入れることのできるコードはありますか?それがコードで実行できるものでない場合は、プログラムの実行が終了した後にファイルを取得する方法がありますか(コンパイラやサーバー上の設定やフラグなど)。
+0

を実行してください。これらのファイルにアクセスしている可能性がある実行中に開始されるサービスまたは追加のプロセスを探します。 – djv

+0

プロジェクトのワークフローはかなりリニアです。プロジェクトは、ユーザーから要求を受け取り、.dllの入力を取得する処理を行い、.dllを呼び出し、.dllの出力を処理し、ユーザーに応答を送信します。応答が送信された後でも、.dllはまだロックされています。 .txtファイルは.dllによってのみ書き込まれます(Webアプリケーションはそれ自体を使用しません)。私の知る限りでは、ファイルを使用する追加のプロセスはありません。 – GeneralMike

答えて

1

DLL テキストファイルの両方がロックされているという事実は、元のプログラマが処分/そのファイルハンドラを閉じるのを忘れている可能性があると考えているように私をリードしています。最も簡単な方法は、a)ソースにアクセスしてファイルを閉じる行を追加するか、またはb)JetBrainsのDotPeekを使用してdllを逆コンパイルして、そこから問題があるかどうかを確認する。
一度に特定のコードブロックを1回だけ使用できるようにするには、名前空間のMonitor.Enter()およびMonitor.Exit()関数を使用して、一度に1人のユーザーのコードブロックを「ロック」することを検討してください。 Debianに精通している場合、これはdpkgがどのようにして2つのプログラムを同時にインストール/削除/ etcから停止するかという考え方と似ています。
手動でプロセスを強制終了する場合は、Array.ForEach(Process.GetProcessesByName("PROCESS NAME HERE"), Sub(x) x.Kill())

+0

答えをありがとう。私はこれが私を正しい軌道に乗せたと思ったが、別のつまずきに遭遇した。私はもっ​​と多くの質問や何かがあれば私の投稿を更新するだろう、私は自分自身でいくつかの事を把握する必要があります。 – GeneralMike

関連する問題