2

更新されるWindowsサービスがあります〜隔週

私はすでにDLLにすべての有用なコードを持っています。サービスは、DLL内の同一のメソッドにマップする単純なメソッドのほんの2つStartですStop

私はコンソールアプリを使用してDLLを開発/デバッグしているので、疑問に思っていました。サービスがDLLを直接参照し、更新を行うたびにアンインストール/再インストールを要求する代わりに、サービスを使用してコンソールアプリケーションをラップすることの欠点はありますか?

つまり、代わりに...

Private MyService as IMyService
Sub Start()
    MyService = New MyService()
    MyService.StartAsync()
End Start

次のようなことをしています...

Const ServiceExecutablePath As String = "C:\Blah\MyService.exe"
Private MyService as Process
Sub Start()
    MyService = Process.Start(ServiceExecutablePath)
End Start

そうすれば、公開したい場合は、サービスを停止し、実行可能ファイル(および関連するDLL)を置き換えてから、サービスを再開するだけです。

正常なシャットダウンを実行する方法はまだよくわかっていません。コンソールアプリは、CTRL C割り込みと呼び出しMyService.Shutdown(Graceful:=True)(ブロッキング呼び出し)をリッスンします。サービス内から同じものをエミュレートする必要がありますか、それともより良い方法がありますか?

4

2 に答える 2

3

コンソールアプリをラップする代わりに、サービスで新しいAppDomainを起動し、dll(プラグインスタイル)を新しいAppDomainにロードして、そこでメソッドを呼び出します。そうすれば、停止時にAppDomainを破棄できます。これにより、交換用のdllがリリースされます。

dllプラグインスタイルをロードすると、アセンブリ参照を保持する必要がなくなります。また、追加のAppDomainを使用すると、サービスAppDomainを破棄せずにdllアセンブリをアンロードできます(通常、操作するのに不快な経験があります)。

サービスは一般的にUIアプリでうまく機能しないため、コンソールアプリをラップすることは避けます。コンソールウィンドウは引き続きUI(コンソールウィンドウ)を生成します。

于 2012-07-07T00:41:23.903 に答える
2

このための実行可能ファイルは必要ありません。サービスを起動するときにDLLを動的にロードできます。手動でロードするか(このリンクを参照)、MEFなどを使用してロードします。

もう1つの簡単なアプローチは、TopShelfを使用してサービスをホストすることです。TopShelfを使用すると、サービスをコンソールアプリケーションとして開発および実行できます。引数installをコンソールアプリに渡すと、サービスとしてインストールされます。インストーラーが不要なため、簡単に交換できます。

于 2012-07-07T00:42:35.077 に答える