(外部の)C++ホスト内で実行されているC++DLLであるプラグインアプリケーションがあります。プラグインのオンライン更新を許可したい。どうやってやるの?
考えられる1つの方法は、DLLをラッパーDLLとコンテンツDLLに分離し、更新のたびに新しいコンテンツDLLに移動することです。
それを達成するためのより良い方法はありますか?
ありがとう
問題の 1 つは、ホスト アプリケーションにプラグインを再起動/リロードさせる方法と、DLL を別のものに置き換える方法です。
Windows(DLLと言ったのでWindowsを想定)では、メモリにロードされている間に実行可能イメージ(DLLを含む)を別のものに置き換えることができない限り、問題があります。POSIX では問題ありませんが (これは副作用もなく確実に動作します!)、Windows は排他的アクセスのためにイメージをロックします。
したがって、最初に DLL をアンロードしてから置き換え、再度ロードする以外に選択肢はありません。これは、あなたが説明したように行うことができます。
ホスト アプリケーションがそれを許可する場合の 1 つの代替方法は、更新するプラグインをアンロードするようにアプリケーションに指示し、それを更新してから、ホスト アプリケーションに再ロードするように指示する2 番目の独立したプラグインを作成することです。
はい、使用中の DLL を直接更新することはできません。2 つの DLL を使用したソリューションは機能しますが、洗練されている可能性があります。少なくとも、アプリケーションの実行中に新しい DLL をアンロードしてロードすることはしません。次回プラグインをロードするときに、新しい DLL をダウンロードしてロードします。
また、自動起動フォルダーにある EXE (および 2 番目の DLL ではない) のアップデーターを使用することもできます。更新がある場合はファイルをダウンロードし、正しい場所にコピーします。ERROR_ACCESS_DENIED が原因で失敗した場合、ユーザーは既にアプリケーションを起動しており、次回ユーザーがログオンしたときに更新によってコピーが行われます。これは簡単で、十分であり (決定する必要があります)、ユーザーにとって透過的であると思います。自動開始フォルダーから更新を削除するか、手動で開始することができます。
ホストを制御できない場合は、動的なロード/アンロードを自分で行う必要があります。お気づきのとおり、これには 2 つの DLL が必要です。これがおそらく最も簡単な方法ですが、DLL の交換中にホストが害を及ぼさないようにする必要があります。おそらく最も簡単な解決策は、両方の DLL をロードしてから、古いコードをアンロードする前にそれらの間でアトミック スイッチを実行することです。