アプリケーションの実行中に.dllファイルを置き換えますか?


18

特定の.dllファイルを使用して実行するゲームサーバーがいくつかあります。時々、ゲームサーバーを更新する必要がありますが、既に実行中のゲームを中断したくありません。

Windowsによってロックされている.dllファイルを置き換える方法はあります。そのファイルを使用するゲームサーバーの次のインスタンスは新しいバージョンを開き、古いインスタンスは再起動されるまでその.dllの古いバージョンを使用し続けます。 ?

それを行うツールのいずれかを使用してファイルをロック解除して置き換えるだけで安全ですか?


おそらくあなたのゲームではありません。ただし、Chrome プロセスを中断せずに更新します。残念ながら、これはアプリケーション固有です。(に移動%LocalAppData%\Google\Chrome\Applicationして、フォルダのように表示されるはず26.0.1410.64の異なるバージョンの店舗のDLL)
アルビンウォンを

問題のソフトウェアによっては、2つ以上の異なるインスタンスを(異なる場所に)インストールして実行できる場合があります。非効率的ですが、おそらく実行可能です。
ハリージョンストン

回答:


23

実際には、あなたはそれができ、通常は問題なく動作します(常にではありませんが)

ファイルを移動せずに名前を変更し、その上に新しいファイルを移動します。これにより、ファイルへのハンドルが有効で機能し、既存のインスタンスがファイルに適切にアクセスでき、新しいインスタンス(または新しいハンドル)が新しいファイルに移動できるようになります。

明らかに、プログラムが同じdllファイルを再度開き、まったく同じままであると予想される場合(たとえば、dllからロードされるリソースがあり、これらのリソースへの参照がdllのロード時に実行されるコードから抽出される場合) )、これは問題を引き起こしますが、これは間違いなく標準ではありません。


11

いいえ。アプリケーションの実行中にDLL 完全に物理メモリにマッピングされる場合でも、それを保証するものではありません。DLL(および実行可能ファイル)の一部はRAMにマップできますが、その他のビットはディスク上に残り、後で読み込むことができます。

WindowsがRAMにマップされているビットを持っている間にディスク上のファイルを変更すると、うまく終了しません。Windowsは正当な理由でロックします。

編集:OS設計の問題ではなく、実際にアプリケーション設計の問題であるとWindowsを非難する人がいるため、何かを明確にする必要があります

プロセスを終了せずにアプリケーションがWindowsで使用するDLLを更新できますが、アプリケーションは、アセンブリをアンロードし、更新が完了するのを待ってからDLLを再ロードするように信号を送ることができるように作成されている必要があります。これは、実行しているOSとは関係ありません。これはアプリケーション設計の問題です。

編集:また、ためにステファンの答えを見ることができソリューションことかもしれないの仕事、どのようにそのDLLへの特定のアプリケーションの応答が変更に応じて。彼は賛成に値すると思います。


そのファイルを一時的な場所に移動して、後で削除できるようにして、古い場所に新しいファイルを配置する方法はありますか?または、ファイルハンドルはファイルの場所にリンクされていますか?

これは、アプリケーションの記述方法/ DLLの使用方法に完全に依存します。Greg Askewの答えを見てください。ファイルハンドルが開いている場合、それに対してできることはあまりありません。ファイルハンドルを強制的に閉じることはできますが、OS全体ではないとしても、少なくともアプリはほぼ確実にクラッシュします。
ライアンリース

それでは、この「正当な理由」とは何ですか?これまでのところ、あなたの答えには、Microsoftがホットスワップの機能を提供しないという説得力のある理由が含まれていません。
コンラッドルドルフ

2

いいえ、既存のファイルハンドルをいじってはいけません。

アセンブリの読み込みを制御し、FileShare.Deleteで開くことを指定できる場合、アセンブリの名前を変更できるはずです。既存のプロセスは、名前を変更したアセンブリを引き続き参照します。

/programming/7147577/programmatically-rename-open-file-on-windows


2
私の経験では、ほとんどの場合(とにかく、半分以上の時間)、アプリケーションをいじることなくDLLの名前を変更できます(削除はできません)。
ハリージョンストン

@HarryJohnston:ええ、.dllが使用中であっても名前を変更できるようです。これからやろうと思います。

1

いいえ、残念ながらできません。

申し訳ありませんが、正確には遅延バインディングがない限り、アプリはそのdllのコードの一部を実行するときにそのdllを使用しますが、それでも信頼性はありません。


1

asp.netがホストするプロセスがどのように機能するかを見て、同様のものを開発できます。

Webアプリケーション全体を取得し、アプリケーションが実際にロードされる一時的な場所に移動します。その後、元のフォルダーの変更を監視するプロセスを終了し、検出されると、アプリケーションの新しいインスタンスを新しい一時的な場所にスピンアップし、新しいリクエストのそのアプリへのリダイレクトを開始します。保留中のリクエストが終了すると、古いアプリは破棄されます。

(Nitpicking、はい、物事の簡略化されたビューです。ほとんどの場合、IISは新しいアプリが引き継ぐまでリクエストをキューに入れます)



0

NSISインストーラーには、マシンの再起動時に移動するという1つのオプションがあり、OSは次のブート時にいくつかのファイルに別の場所に移動するようフラグを立てます。これに関する少しの検索は、この点であなたを幸せにします。


OPにソリューションを検索するように指示する代わりに、返信で完全な回答を提供できます。彼はここで彼がすでに解決策を見つけたかどうかを尋ねません。ありがとう。
ジョン別名hot2use 16年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.