web-dev-qa-db-ja.com

C#Windowsサービスが自動的に更新されるようにしたい

C#Windowsサービスが新しいバージョンを自動的にチェックしてそれ自体をアップグレードできるようにするために使用できるフレームワークはありますか?私は確かにこれを達成するためのコードを書くことができますが、私はすでに実装され、(最も重要なことに)テストされたフレームワークを探しています。

[編集]これは、これを達成するのに役立つ最新のプロジェクトへのリンクを含む同様の質問へのリンクです: 。NETのライブラリを自動更新しますか?

31
Larry Smithmier

タイプをアンロードする唯一の方法は、appdomainを破棄することです。これを行うには、ホスティングレイヤーを実行中のサービスコードから分離する必要があります-これはかなり複雑です。 (鍵穴手術をするようなものです)

A)バッチタスクを実行するか、b)サービス中の更新を検出してから、サービスを停止する別のプロセスを起動し、アセンブリなどを更新してから再起動する方が簡単な場合があります。

前者に興味がある場合は、MSDNのパターンとプラクティスの人々が、サービスに適応するアプリアップデーターブロックを作成しました。

https://web.archive.org/web/20080506103749/http://msdn.Microsoft.com/en-us/library/ms978574.aspx

16
stephbu

私は、この特定の問題の解決を促進するフレームワークを知りません。

ただし、試すことができるのは、サービスのビジネスロジックを実際のサービスコードからさまざまなアセンブリに分離することです。サービスアセンブリにビジネスロジックアセンブリの更新を定期的にチェックさせ、必要に応じてリモートソースからコピーし、古いBLアセンブリをアンロード(おそらく削除)してから、新しいバージョンを動的にロードします(古いアセンブリのアンロードはそうではありません)些細な作業)。

3
ilitirit

別の可能な解決策は、別のサービスを実行し、更新がある場合はもう一方のサービスを停止してから、サービスを更新することです。実行中の.dllが停止しないため、サービス自体を更新することはできません。

ビジネスロジック層を分離することは良いオプションです。メインサービスを書き直して、マスターサービスまたは制御サービスによるリフレクションの下で実行することもできます。これはビジネスロジックを分離することに似ており、スレッドを停止して再開するだけで済みます。

私はこれを行う既知のフレームワークを知りません。私はこれを自分で行いましたが、それは公的な枠組みではありません。

2
David Basarab

私はWyBuildを使用してアプリケーション(Windowsサービスを含む)を更新してきましたが、それはかなり素晴らしいです。本当に使いやすく、既存のアプリケーションとの統合もとても簡単です。それはかなり素晴らしい自動更新フレームワークです...

http://wyday.com/wybuild/help/automatic-updates/windows-services-console-apps.phphttp://wyday.com/wybuild/help/silent- update-windows-service.php

これは有料のフレームワークであることに注意してください(ライセンスは開発者ごとであり、無料トライアルが含まれています)

2
Omaer

他の誰かがこれを探している場合に備えて;このリンクは面白いと思いました。私はこのソリューションを実装していませんが、うまくいくようです

http://www.eggheadcafe.com/articles/20041204.asp

1
gillonba