特定の.dllファイルを使用して実行するゲームサーバーがいくつかあります。ときどきゲームサーバーを更新する必要がありますが、既に実行中のゲームを中断したくありません。
.dllファイル(Windowsによってロックされています)を置き換える方法はありますか?そのファイルを使用するゲームサーバーの次のインスタンスは新しいバージョンを開き、古いインスタンスは再起動するまでその.dllの古いバージョンを使用し続けます?
それを行うツールの1つを使用してファイルのロックを解除し、それを置き換えるだけで安全ですか?
実際、あなたはそれを行うことができます通常は問題なく動作します(常にではありません)
ファイルを移動せずに名前を変更し、新しいファイルをその上に移動します。これにより、ファイルへのハンドルが有効で機能し続けるため、既存のインスタンスがファイルに適切にアクセスでき、新しいインスタンス(または新しいハンドル)が新しいファイルに移動します。
明らかに、プログラムが同じdllファイルを再度開いて、まったく同じであると期待する場合(たとえば、dllからロードされるリソースがあり、これらのリソースへの参照が、dllのロード時に実行されるコードから抽出される場合) )、これは問題を引き起こしますが、これは間違いなく標準ではありません。
いいえ。アプリケーションの実行中にDLL mayが完全に物理メモリにマップされる場合でも、その保証はありません。DLLの一部(さらには実行可能ファイル) RAMにマップできますが、他のビットはディスクに残り、後で読み込むことができます。
RAM=にマッピングされたビットがWindowsにある間にディスク上のファイルを変更すると、正常に終了しません。Windowsは、それを正当な理由でロックします。
編集:実際にapplicationの設計の問題であり、OSの設計の問題ではないものについてWindowsを非難することに熱心な人もいるので、私は何かを明確にする必要があります。
プロセスを終了せずにアプリケーションがWindowsで使用するDLLを更新できますが、アプリケーションは、アセンブリをアンロードし、更新が完了するのを待ってからDLLを再ロードするように通知できるように記述されている必要があります。これは、実行中のOSとは関係ありません。これはアプリケーション設計の問題です。
編集:特定のアプリケーションがDLLの変化にどのように応答するかに応じて、可能性があるが機能する可能性があるソリューションについては、Stephaneの回答も参照してください。I彼は賛成に値すると思います。
いいえ、既存のファイルハンドルをいじってはいけません。
アセンブリの読み込みを制御でき、それがFileShare.Deleteで開かれていると指定できれば、名前を変更できるはずです。既存のプロセスは、名前が変更されたアセンブリを引き続き参照します。
https://stackoverflow.com/questions/7147577/programmatically-rename-open-file-on-windows 。
いいえ、残念ながらできません。
申し訳ありませんが、正確に言えば、遅延バインディングがない限り、つまり、アプリがそのdllのコードの一部を実行するときにそのdllを使用しますが、それでも信頼性はありません。
あなたは、asp.netがホストするプロセスがどのように機能するかを見て、同様のものを開発することができます。
Webアプリケーション全体を受け取り、アプリケーションが実際にロードされる一時的な場所に移動します。次に、元のフォルダーの変更を監視するプロセスを残し、検出されると、アプリケーションの新しいインスタンスを新しい一時的な場所にスピンアップし、新しいリクエストをそのアプリにリダイレクトし始めます。保留中のリクエストが完了すると、古いアプリは破棄されます。
(ちなみに、はい、これは物事の簡略化されたビューです。ほとんどの場合、IISは、新しいアプリが引き継ぐことができるようになるまでリクエストをキューに入れます)
約10年前、私は http://www.eggcentric.com/ISAPILoader.htm を使用して幸せでしたIIS ISAPI dllスワッピング。Egg氏) FOSSソリューションを引き続きサポートしています。
NSISインストーラーには、マシンの再起動時に一時的に移動するという1つのオプションがあり、OSは次の起動時に別の場所に移動するようにいくつかのファイルにフラグを立てます。これについて少し検索すると、この点であなたは幸せになります。