小さなソフトウェアパッチは大きなソフトウェアをどのように修正しますか?
-
02-07-2019 - |
質問
私がいつも気になっていたことの1つは、ソフトウェアパッチの仕組みです。多くのソフトウェアは、古いバージョンの上にインストールする必要がある新しいバージョンをバイナリでリリースしているようですが、一部のソフトウェア(特にWindowsなどのオペレーティングシステム)は、バグを修正したり既存の機能を追加したりする非常に小さなパッチをリリースできるようですソフトウェア。
ほとんどの場合、私が見るパッチは、アプリケーション全体、またはアプリケーション内で使用される小さなファイルでさえも置き換えることはできません。私には、実際のバイナリが変更されているようです。
これらの種類のパッチは実際にどのように実装されていますか?これがどのように機能するかを説明するリソースを誰かに教えてもらえますか?または、アプリケーションのリンクライブラリなどの小さなコンポーネントを置き換えるのと同じくらい簡単ですか?
おそらくこの方法で展開する必要はないでしょうが、どのように機能するのか知りたいです。パッチが実際にバイナリファイルの一部のみを変更できるという理解で正しい場合、これは.NETで実行できますか?それが私が最もよく知っているフレームワークであり、それがどのように機能するかを理解したいので、私はそれを学びたいです。
解決
これは通常、バイナリdiffアルゴリズムを使用して実装されます。最新のバージョンと新しいコードを比較します。ユーザーが最新バージョンを実行している場合は、差分を適用するだけです。コンパイルされたコードは通常、バージョン間でかなり似ているため、ソフトウェアに対して特にうまく機能します。もちろん、ユーザーが最新バージョンを実行していない場合は、とにかくすべてをダウンロードする必要があります。
一般的なバイナリdiffアルゴリズムの実装がいくつかあります: bsdiff および xdelta は、優れたオープンソース実装です。 .NETの実装は見つかりませんが、問題のアルゴリズムはプラットフォームに依存しないため、プロジェクトのように感じても移植は難しくありません。
他のヒント
Windowsアプリケーションへのパッチ適用について話している場合、見たいのは.MSPファイルです。これらは.MSIに似ていますが、パッチとアプリケーションのみです。
パッチとアップグレード MSDNドキュメント内。
.MSPファイルは、更新されたファイルをアプリケーションのインストールにロードします。これは通常、更新されたdllおよびリソースファイルですが、任意のファイルを含めることができます。
インストールされたアプリケーションへのパッチ適用に加えて、C:\ WINDOWS \ Installerにある修復ファイルも更新されます。次に、ユーザーが[修復]を選択すると、 [プログラムの追加/削除]から、更新されたパッチファイルも使用されます。
John Millikinが説明したバイナリdiffメソッドは、他のオペレーティングシステムで使用する必要があると考えています。 Windowsで動作させることもできますが、やや異質です。