質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

3545閲覧

C#での別アプリケーション起動について

mentos109

総合スコア28

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2016/11/27 12:23

現在C#にて、あるアプリケーションが常に起動されている状態を保つためのサービスを作りたいのですが、うまく行きません。
どうすればいいのでしょうか?
現在は、System.Diagnostics.Processを用いて実現しようとしているのですが、タスクマネージャーを見るとたしかにうまく行ってるのですが、通常の、exeファイルをダブルクリックした時の挙動のようにウィンドウが出たりタスクアイコンに表示されたりもしておらず、機能もしておりません。

C#

1 2 private TaskFactory task = new TaskFactory(); 3 private CancellationTokenSource tokenSource = new CancellationTokenSource(); 4 private bool flag; 5 private Process p = new Process(); 6 7 public Service1() 8 { 9 InitializeComponent(); 10 } 11 12 protected override void OnStart(string[] args) 13 { 14 task.StartNew(() => 15 { 16 ProcessStartInfo psi = new ProcessStartInfo(); 17 psi.FileName = "アプリのパス"; 18 flag = true; 19 20 for (;;) 21 { 22 if (tokenSource.Token.IsCancellationRequested) 23 break; 24 if (flag) 25 { 26 try 27 { 28 p = Process.Start(psi); 29 } catch(Exception) 30 { 31 ExitCode = 1; 32 return; 33 } 34 } 35 flag = p.WaitForExit(30000); 36 } 37 }, tokenSource.Token); 38 } 39 40 protected override void OnStop() 41 { 42 RequestAdditionalTime(2000); 43 44 tokenSource.Cancel(); 45 46 ExitCode = 0; 47 }

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MagoCat

2016/11/30 20:01

常に起動されている側のアプリはどのような性質ですか?例えば複数のユーザーアカウントが同時にサインインしている時はそれら各ユーザーアカウント毎に起動している類のものですか? また、どのユーザーアカウントもログインしていないときでも起動していた方が良いものですか? 性質次第ではちょっとは踏み込んだ回答が可能かもしれないので、もしもまだ問題に悩んでいるのであればアプリの性質を追加して貰っても宜しいでしょうか。
mentos109

2016/12/01 03:24

試していたアプリは2つありまして、一つはSpinelというTVチューナーの電波をソフトウェア的に分配するようなソフトウェアです。そしてもう一つはWheelBallという、マウス操作でスクロールができるようになるようにするソフトです。どちらもウィンドウもしくはタスクトレイアイコンが表示されるタイプのアプリなんですが表示されませんし、実際の動作で不具合を生じました。ユーザーアカウントはどれも一つの状態でしか試していないので詳しいことはわかりませんが、前者はログインしてない状態でも起動していたほうがいいものです。どちらも古いアプリなので、単純にWindows10に対応してないのかもしれません。
guest

回答1

0

ベストアンサー

サービスアプリケーションを実現したいのであれば、Windowsサービスアプリケーションとして開発するほうがよいと考えます。
プロジェクト作成時に「テンプレート」→「VisualC#」→「クラシックデスクトップ」→「Windowsサービス」で、サービスアプリケーションのテンプレートを選択できます。
以下のサイトが参考になると考えます。
https://social.msdn.microsoft.com/Forums/ja-JP/5babe4e4-c945-4ec5-bea4-29d0065a77b1/visualstudio-2015?forum=csharpgeneralja
https://msdn.microsoft.com/ja-jp/library/y817hyb6(v=vs.110).aspx

投稿2016/11/27 13:46

nakasho_dev

総合スコア2655

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mentos109

2016/11/27 13:54

書き忘れていました。そのことは理解してまして、上の記述はそのテンプレートで生成されたコードに書き足したものです。
nakasho_dev

2016/11/27 15:46

クラスの宣言は省略されていましたがServiceBaseを継承したクラスで実装されているのですね、失礼いたしました。 「あるアプリケーション」をダブルクリックで起動するとWindowやタスクトレイアイコンが表示されるのに、サービスから起動すると表示されないということですね。 関係あるか否かは分かりませんがonStartの中で監視処理をしているとサービスそのものが開始されないです。 下記のサイトで同様のプロセス監視を例を示されているようですが参考になりますでしょうか。 http://qiita.com/tadokoro/items/f1643021f97dd9e8cafa
mentos109

2016/11/28 00:00

教えていただいたサイトの記述から、CreateNoWindowをfalse、WindowStyleをNormalに変えてみたところ、相変わらずウィンドウがなぜか表示されませんが、プログラム自体は動作しているようでした。ありがとうございます。
mentos109

2016/11/28 16:54

すみませんわざわざありがとうございます。 しかし、そもそもタスクバーにもアイコンが何も表示されておらず、存在がタスクマネージャーでしか確認できないので効果はありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問