32

静的メソッドを持つクラスを持つ.NETクラスライブラリがあります。コードでその静的メソッドを別のプロセスで実行したいのですが、別のスレッドで別のプロセスで実行するのと同じ方法です。

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

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

4

1 に答える 1

30

fork残念ながら、 POSIX互換のオペレーティングシステムのCのように、C#ではできません。

いくつかのオプションがあります。無限ループから保護することだけを目的としているので、新しいものThread(1つまたは1つではなく、新しいもの)を生成することができます。次に、スレッドを強制終了する必要がある場合は、スレッドを呼び出すことができます。これにより、他のスレッドでがトリガーされます。ThreadPoolTaskAbortThreadAbortException

他のオプションはAppDomainです。現在実行中のアセンブリを使用して、比較的簡単に新しいものを作成できます。AppDomain次に、ドメイン全体に実際に存在するプロキシオブジェクトを呼び出します。プロキシは、旧式の.NETリモーティングを使用して、実際のオブジェクトのメソッドを呼び出します(.NET 1.1ベースの構造に制限されているため、ジェネリックパスなどはありません)。

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

2番目のOSレベルのプロセスを取得することを本当に、本当に、本当に決心している場合は、一時ファイルに新しい実行可能アセンブリをその場で生成し、それを新しいプロセスで開始することもできます。新しいアセンブリの生成に関するMSDNの記事については、こちらを参照してください。これは決して些細なことではないことに注意してください。

于 2012-10-18T11:28:30.893 に答える