2012-10-18 9 views
24

私は静的メソッドを持つクラスを持つ.NETクラスライブラリを持っています。私は別のプロセスで別のスレッドで実行するのと同じ方法で、その静的メソッドを別のプロセスで実行するようにコードを設定します。コンソールアプリケーションを作成することなく、C#コードを別のプロセスで実行できますか?

Main()から静的メソッドを呼び出す別のコンソールアプリケーションプロジェクトを作成できますが、それは私の展開シナリオにとっては便利ではありません。余分な.exeファイルを運んでいません。私はuse Powershellを呼び出すことができますが、それは私がむしろ避けたいPowershellに依存していることを意味します。

.NETを使用して別のプロセスでコードを実行する方法はありますか?たぶん、実行時に別のプロセスの実行可能ファイルを作成することができますか?

+0

既存のアプリにコマンドラインオプションを使用できますか? – Gabe

+0

なぜこれを行う必要がありますか?最初のプロセスが終了したらプロセスは継続して実行する必要がありますか? –

+0

@Gabe:いいえ、私の現在のコードは、サロゲートに読み込まれたクラスライブラリです。 – sharptooth

答えて

23

Unfortunately, you cannot fork in C# like you can in C on POSIX-compatible operating systems.

あなたはいくつかのオプションがあります。無限ループを防ぎたいだけなので、新しいThread新しいの1つで、ThreadPoolの1つではなく、Taskの1つ)を生成することができます。その後、あなたがそれを殺す必要がある場合は、Abortをスレッド上で呼び出すことができます。これにより、もう一方のスレッドでThreadAbortExceptionがトリガーされます。

他のオプションはAppDomainです。 You can create a new AppDomain using the currently running assembly relatively trivially.次に、ドメイン全体に実際に存在するプロキシオブジェクトを呼び出します。プロキシは、古いオブジェクトの.NET Remotingを使用して、実際のオブジェクトのメソッドを呼び出します(.NET 1.1ベースのコンストラクトによって制限されているため、汎用のパスなどはありません)。

上記のいずれの方法も、アンマネージコードのクラッシュからあなたを守らないことに注意してください。 AppDomainsは管理された構造体なので、管理されていないハングアップを中止するために使用することはできません。

本当にが2番目のOSレベルのプロセスを取得すると判断された場合は、新しい実行可能アセンブリを一時的なファイルに生成して新しいプロセスで開始することもできます。 See here for an MSDN article on new assembly generation.これはまったく些細なことではないことに注意してください。

+3

+1は、別のプロセスで実行するためにオンザフライでアセンブリを生成する恐ろしい考えのために+1です。 –

+0

@sharptoothこれは質問に答えますか? –

+2

実行時にコンソールアプリケーションを作成する方法については、この偉大な答えhttp://stackoverflow.com/a/826435/57428を見つけました。それは全く難しいことではありません。 – sharptooth

関連する問題