トップ回答者
windowsサービスが起動できない C#

質問
-
C#でwindowsサービスを作成しました。visual studio 2017を使用しています。
OSはwindows10 proです。
いちよう以下のコードは入力した時点でエラーが出ていませんでした。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; using System.Threading; using System.Threading.Tasks; namespace addonblocker { public partial class Service1 : ServiceBase { public Service1() { InitializeComponent(); } protected override void OnStart(string[] args) { new Service1().Addonkiller(); } public void Addonkiller() { var timer = new Timer(new TimerCallback(Check_Process)); Console.WriteLine("{0}タイマーを起動します", DateTime.Now.ToString("h:mm:ss.fff")); timer.Change(0, 1000); for (; ; ) { }; // これがないとプログラムが終了する。 } public void Check_Process(object args) { foreach (var p in Process.GetProcesses()) if (p.MainWindowTitle == "アドオンマネージャー - Mozilla Firefox")
ユーザーアカウントで作成し、インストールなど必要なところは管理者権限を実行して画面をすすめました。
インストールも成功しました。
いざ起動させようとすると
ローカルコンピュータのservice1サービスを開始できません
エラー1053 そのサービスは指定時間内に開始要求または制御要求に応答しませんでしたこのエラーが出た場合、以下のことを実行してくださいとこのページで紹介がありました。
1つ目はf5で更新してみて、エラーが出るかどうかの確認でしたが、開始中となったまま起動できません。
2つ目は
システムのイベント ログのソース "Service Control Manager" のエラーイベントが発生していないかご確認下さい。
これはイベントログのどこを参照にするのでしょうか。詳細に教えてください。
また、プログラムのコードとして、間違えているところがあるのでしょうか。windowsサービスは何かに向いていないプログラムと聞いたのですが、
windowsサービスでは動作しないようなコードがあるのでしょうか。
回答お願いします。
回答
-
そんな感じです。
WinFormでの制作経験があれば、Loadイベントで無限ループしなくてもアプリケーションは終了しないし、むしろ無限ループするといつまで経っても起動しない、というのと同じと考えると分かりやすいかと思います。
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年10月4日 1:30
- 回答としてマーク tttttttttttttttttttaaugh 2017年10月8日 2:35
-
本筋については Hongliang さんが指摘されているので別件を。
OnStart はインスタンスメソッドであり、それが呼び出される時点で Service1 のインスタンスはすでに生成されています。
よって、その中で new Service1() とする必然性はなく、単に Addonkiller() と呼んだ方がシンプルになるでしょう。次に、これが大きな問題となると思いますが、そのサービスはログオンしているデスクトップとは別のセッションとなるので、MainWindow あたりの情報は取得できないのでは?と予想します。
そのあたりは下記スレッドが似たようなことをやろうとしてできない旨の説明がなされていますので参考にしてください。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=63061&KLOG=106- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年10月4日 1:31
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年10月16日 5:56
すべての返信
-
Windowsサービスでは、OnStartからさっさと処理を返す必要があります。
サービスとして起動した場合、AddonKiller最後の無限ループがなくても、サービスは終了しないはずです。
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年10月4日 1:30
-
そんな感じです。
WinFormでの制作経験があれば、Loadイベントで無限ループしなくてもアプリケーションは終了しないし、むしろ無限ループするといつまで経っても起動しない、というのと同じと考えると分かりやすいかと思います。
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年10月4日 1:30
- 回答としてマーク tttttttttttttttttttaaugh 2017年10月8日 2:35
-
本筋については Hongliang さんが指摘されているので別件を。
OnStart はインスタンスメソッドであり、それが呼び出される時点で Service1 のインスタンスはすでに生成されています。
よって、その中で new Service1() とする必然性はなく、単に Addonkiller() と呼んだ方がシンプルになるでしょう。次に、これが大きな問題となると思いますが、そのサービスはログオンしているデスクトップとは別のセッションとなるので、MainWindow あたりの情報は取得できないのでは?と予想します。
そのあたりは下記スレッドが似たようなことをやろうとしてできない旨の説明がなされていますので参考にしてください。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=63061&KLOG=106- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年10月4日 1:31
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年10月16日 5:56
-
回答ありがとうございます。
サービスは起動しましたが、azuleanさんの指摘した通り、firefoxのアドオンマネージャーを開いても
全く反応がありませんでした。(コンソールアプリにしたときはちゃんと動作していました)
参照リンクをみたのですが、
windows APIを使用すれば、サービスでもちゃんとウィンドウ名を指定して閉じるといった動作が可能という結論であっているでしょうか。
Win32 APIのFindWindowを使用した方法
これをベースにしてwindowsサービスのonstartに入れてやれば、実現可能でしょうか。