ある日、ある男がHelikaの
Edison Softwareにやってきました。 法案を見た彼は、目を細めて叫んだ。 私は貧しい!」 これは、キャッチフレーズであり、プロジェクトのクラス全体のラベルになっています。 そのため、次の条件を遵守しながら、Windowsサービスの自動更新を実装する必要がありました。
- サービスは、ユーザーの介入なしに自動的に更新されます。
- サービスパックを保存するには、無料のサービスまたは長期間無料で使用できるサービスを使用します。
- ソリューションはシンプルで、サービスのロジックを変更しません。
パッケージを保存するサービスを選択する
Amazon Web Services(AWS)は、サービスパックを保存するサービスとして選択されました。 彼が選んだ主な理由は次のとおりです。
- AWSは、ほとんど制限のない1年間の無料アクセスを提供します。
- AWSは、NuGet(AWSSDK.S3)からアクセスできるライブラリが開発されたクラウドストレージを操作するためのAPIを提供します 。
メカニズムの選択
自動更新用の次のライブラリが考慮されました。
- AutoUpdate.Net;
- Squirrel.Windows;
- ClickOnce。
しかし、それらはすべて私たちのニーズを満たしていませんでした。
AutoUpdate.Netでは、アップグレード中にユーザーの参加が必要でした。 また、ライブラリ自体は長い間サポートされていません。
Squirrel.Windowsは必要な機能をすべて備えていましたが、Win7 x64のシステムレベルでアプリケーションをインストールできなかったため、バグが見つかりました。
ClickOnceは、システムレベルでアプリケーションをインストールできません。 サービスをインストールする必要があるため、このソリューションも拒否する必要がありました。
更新メカニズム
- ソフトウェアのインストール中、インストーラーはWindowsスケジューラーで自動更新プログラムのスケジュールされた起動を登録します。
- スケジューラによって自動更新プログラムを実行します。
- AWSで新しいインストールパッケージを確認する
- 新しいインストールパッケージを取得します。
- サービス停止。
- サイレントモードで新しいパッケージを起動し、更新プログラムプロセスを完了します。
新しいインストールパッケージは、次のアクションを実行します。
- システムから以前のバージョンのソフトウェアを削除(アンインストール)。
- 新しいソフトウェアバージョンのインストール(インストール)。 ソフトウェアの新しいバージョンに加えて、アップデータも更新されます。
- 更新されたサービスを開始します。
MSIインストールパッケージは、
WIX (または別のユーティリティ)を使用して作成され、簡単です。 ただし、更新プロセスの単純さには欠点もあります。
- 新しいサービスパックをインストールする際のエラー制御はありません。
- サービスパックファイルは一時的なWindowsディレクトリに蓄積されます。
これらの欠点は重要ではありません。 通常の操作では、インストールは常にエラーなしで行われます。 更新が行われなかった場合、ユーザーはいつでも手動でソフトウェアを再インストールできます。 インストールパッケージのサイズは小さく、更新も頻繁に行われないため、Windowsの一時ディレクトリにファイルが存在しても問題は発生しません。
AWSからパッケージをダウンロードする
インストールパッケージは、このフォームでAWSに保存されます。
string BucketKeyName = "general/{0}/Setup.msi";
AWSサービスに保存されている最新のバージョン番号を取得するには、次の関数を実装します(サービスへの登録後、アカウントでAwsKeyId、AwsSecretKeyおよびAwsRegionが利用可能になります)。
private static Version GetLatestVersion() { using (var client = new AmazonS3Client(AwsKeyId, AwsSecretKey, AwsRegion)) { var listRequest = new ListObjectsRequest() { BucketName = BucketName, Prefix = "global/", Delimiter = "/", }; var response = client.ListObjects(listRequest); var versions = response.CommonPrefixes.Select(prefix => { try { var versionString = prefix.Replace(listRequest.Prefix, "").Replace("/", ""); return new Version(versionString); } catch { return new Version(); } }); return versions.Max(); } }
次の関数は、インストールパッケージのダウンロードに使用されます。
private static FileInfo DownloadInstallerFor(Version version) { var request = new GetObjectRequest { BucketName = BucketName, Key = string.Format("general/{0}/Setup.msi", version.ToString()), }; string dest = Path.Combine(Path.GetTempPath(), request.Key); using (var client = new AmazonS3Client(AwsKeyId, AwsSecretKey, AwsRegion)) { using (var response = client.GetObject(request)) { if (!File.Exists(dest)) { response.WriteResponseStreamToFile(dest); } } } return new FileInfo(dest); }
自動更新プログラムの主な機能。
static void Main(string[] args) { var currentFolder = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); var serviceFullFileName = Path.Combine(currentFolder, ServiceFileName); Console.WriteLine(serviceFullFileName);
提示された自動更新メカニズムはおそらく唯一のものではありませんが、数か月にわたる優れた操作でうまく機能しています。 同時に、作成コストは最小限でした。
その他のプロジェクト:
5233人時でマイクロトモグラフ用のソフトウェアを作成する方法FB2形式の電子書籍のサポートを実装するSDK電子文書へのアクセスを管理します。 DefViewからVivaldiへAxxon NextとSureViewの2つのビデオ監視システムを統合しますX線トモグラフィーソフトウェアの開発の詳細「スコープ」:数十億キロワット時を監視する方法データベースを操作するためのシンプルなJIRAプラグインの開発DevOpsを支援する:1008時間でDebian上のネットワークデバイスのファームウェアビルダー貧しい人々のためのAWSを介したWindows Auto Service Update