2009-06-17 8 views
9

私が開発したプラットフォーム用の外部アップデータアプリケーションを起動しようとしています。このアップデータを起動したいのは、プラットフォームのアップデートとライセンス設定を処理する私の設定ユーティリティが、アップデートが配備されるフォルダ内の他のアセンブリと依存関係を共有しているからです。ですから、私が設定ユーティリティの名前を変更してアップデートをデプロイするときに上書きすることはできますが、依存するDLLの名前を変更したり上書きすることはできません。したがって、外部アップデータアプリケーション。親プロセスよりも寿命の長いプロセスを作成する方法

構成ユーティリティですべての更新収集ロジックを処理してから、実際のファイルコピー/上書き操作を処理するためにアップデータを起動しようとしています。明らかに、使用中のファイルの問題のため、アップデーターの開始直後に設定ユーティリティーを終了する必要があります。

私が抱えている問題は、標準のProcess.Startメソッドを使用してアップデータを起動していて、設定ユーティリティが終了するとすぐにアップデータプロセスも強制終了されるということです。

親プロセスよりも寿命の長いプロセスを作成する方法や、起動したプログラムを超えて実行できる外部アプリケーションを起動する方法はありますか?

EDIT:

はどうやら、私のアップデータアプリケーションでは、私はそれに渡されるコマンドライン引数の数を誤算しました。このため、アップデータはすぐに終了します。私はこれを誤解して、ランチャーアプリケーションが「子供」プロセスを殺していたということを誤解しました。実際、そうではありませんでした。

以下の回答が正しいです。

+0

私はそれが逆説的なものだと知っていますが、構成ユーティリティとアプリケーションの両方を起動することが全体の仕事であるというプロセスを持つことができますか?そうすれば、アプリケーションと設定ユーティリティの両方を個別に更新することができます(必要に応じて)。親プロセスが親プロセスで実行されることを心配する必要はありません。 –

+0

アップデータコードにバグがあり、すぐに終了するようになりました。私は、これを閉じている "起動"プロセスからのものであると仮定しました。私はそれに応じて私のメッセージを更新しました。そんなばかげた間違いをするための自己処罰として自分自身を否定的な担当者にする方法はありますか? –

+0

C#/ Mono/* nixではなく、C#/ .net/Win32を使用していると仮定できますか?プロセスがすべての環境で同じように機能するかどうかはわかりません。 – quillbreaker

答えて

11

いくつかのコードを共有してください。 Processクラスは、アプリケーション終了時にProcess.Startを使用して開始されたプロセスを強制終了しないため、表示されている問題は別の理由があるようです。

電卓が開いたままになり、この簡単なサンプルプログラムを参照してください:私の霧のメモリからわずかな思考

using System.Diagnostics; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Process.Start(@"C:\windows\system32\calc.exe"); 
    } 
} 
+0

あなたは絶対に正しいです、私の前提は、不幸にもスピードで濁っていました。私はそれに応じて私の質問を更新しました。 –

5

ランチャーが終了すると、Process.Startで開始されたプロセスが自動的に終了する理由はありません。私の推測では、あなたがアップデーターで何か奇妙なことをやっているということです。

私はこれまでにこのようなことをしているアップデータを書いています。例えば

Launcher.cs:

using System; 
using System.Diagnostics; 

class Launcher 
{ 
    static void Main() 
    { 
     Console.WriteLine("Launching launchee"); 
     Process.Start("Launchee.exe"); 
     Console.WriteLine("Launched. Exiting"); 
    } 
} 

Launchee.cs:

using System; 
using System.Threading; 

class Launchee 
{ 
    static void Main() 
    { 
     Console.WriteLine("  I've been launched!"); 
     Thread.Sleep(5000); 
     Console.WriteLine("  Exiting..."); 
    } 
} 

は別に、それらの両方をコンパイルし、Launcher.exeを実行します。 「ランチ」プロセスは、ランチャーよりも長く続きます。

+0

アップデータを起動する設定ユーティリティは、Windowsフォームアプリケーションです。これは私が見ているものと何か関係がありますか? –

+0

私は似たようなことをしています。私のコンソールアプリケーションは、ソケットを介してオープンな接続を持つJavaプロセスを開始しています。コンソールアプリケーションのメインメソッドが値(int戻り値)を返しても、コンソールは閉じません。 。私は、javaプロセスが実行されるまで推測します。何か案は? –

+0

@KyloRen:[mcve]がなければ、本当はありません。あなたが再現できる方法で新しい質問を投稿することをお勧めします。 –

0

が、私はProcess.Startメソッドがあるときことをしばらく前に話し合いを持つ覚えているようですフォームから呼び出され、生成されたプロセスには何らかの依存性があります(何が、なぜ、どのように、メモリが少し霧になるかは不明です)。

これを処理するには、メインフォーム/アプリケーションが終了した後でMain()メソッドからプロセスが起動された場合に、実際にアプリケーションのMain()メソッドから呼び出されたフラグが設定されていました。ちょうど良い。

私が言ったように、これは純粋にメモリからのものですが、コンソールアプリケーションのMain()メソッドから呼び出された例のいくつかは、何かをジョギングするように見えました。

すべてがうまくいきます。

+1

私はそのような振る舞いを再現することができず、この場合、私は本当に驚くでしょう。子プロセスは、親プロセス内で特別な動作を実装してすべての子プロセスを終了させない限り、親プロセスが死ぬかどうか(通常はOSレベルのもの)を通知しません。 –

+0

私は同じ仮定をしていた、明らかに私たちの記憶は何らかの精神的なIPCまたは何かを使用しています:) –