クライアントのマシンで実行されている Windows サービスを作成しました。このサービスは、それ自体の新しいバージョンを時折ダウンロードし、自己更新を実行します。つまり、新しいサービスをインストールし、開始し、古いサービスを停止し、最終的に削除します。サービスは、それ自体を直接停止して他の処理を実行することはできないため、別の実行可能ファイルをスピンして、いくつかの作業を実行します。これを正しく行うのは難しく、新しいサービスが新しい .Net Framework を使用して構築されている場合 (最近の .Net 2.0 から .net 4.0 への切り替えなど) は特に問題になります。問題は、.Net 2.0 ライブラリが .Net 4.0 サービスで動作できないことです。
さて、1 つのアプローチは、古いバージョンのサービスに、新しいバージョンに付属するヘルパー プログラムをスピンさせることです。いくつかのものが通常同じままであっても、バージョンを混同しない方が安全だと思います-設計の複雑さを抑えるのに役立ちます.
現在、Windows サービスで動作する .Net バージョンに依存しない方法があるようsc.exe
です: ツール: http://support.microsoft.com/kb/251192
私が求めていたのは本当に特効薬なのだろうか。さて、私はこの男をプログラムで呼び出してエラーをチェックするので、API を使用することもできます。理想的には、SC.exe とインターフェイスするネイティブ exe にコンパイルされる 1 つのネイティブ C++ プロジェクトが必要です。これは可能ですか?そうでない場合、別のコンピューターで sc.exe を見つけるにはどうすればよいですか? それらは 32 ビットまたは 64 ビットであり、Win XP SP2/3 以降の任意のバージョンの Windows を実行しています。
私の質問、独創的なアイデア、または私がここで提起した正確な質問に対する回答について質問がある場合はお知らせください.
編集: 2.0 コードを使用して 4.0 サービスをインストールしようとすると、次の場合と同じエラーが発生します。
> C:\Windows\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe MyService4.exe
Microsoft (R) .NET Framework インストール ユーティリティ バージョン 2.0.50727.4927 Copyright (c) Microsoft Corporation. 全著作権所有。
インストールの初期化中に例外が発生しました: System.BadImageFormatException: ファイルまたはアセンブリ 'file:///[path]\MyService4.exe' またはその依存関係の 1 つを読み込めませんでした。このアセンブリは、現在読み込まれているランタイムよりも新しいランタイムによってビルドされているため、読み込むことができません..