IISWebアプリケーション内から小さなコンソールアプリケーションを起動しています。コードは、次のようなコードを使用してアプリプール内から開始されます。
Process process = new Process();
ProcessStartInfo processStartInfo = new ProcessStartInfo();
processStartInfo.CreateNoWindow = true;
processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
// ..
process.Start();
以前は断続的にエラーが発生していましたが、
Win32Exception exception has occured Message: No such interface supported
ErrorCode: 80004005 NativeErrorCode: 80004002
これが発生したとき、コンソールアプリケーションがまったく起動しないことを証明しました。
この上のコードに追加しました、
processStartInfo.UseShellExecute = false;
そして、問題は解決しました(これまでのところ、指が交差しています)。この変更を行うことで、実行に有効なデスクトップコンテキストが必要ないことを理解していますが、それは正確にはどういう意味ですか。デスクトップがない場合(システムユーザーで実行されているIISアプリプールに適用されます)に上記のコードを実行できない場合、毎回失敗するのではなく、過去に実行されていたのはなぜですか?
なぜこれが違いを生むのか誰かが知っていますか?このコンテキストでサポートされているインターフェイスがないということはどういう意味ですか?
アップデート:
私は人々が言ったことすべてを取り入れ、自分自身でさらに調査を行いました。したがって、UseShellExecute = true(デフォルト)がある場合を要約すると、shell32.dllのShellExecuteEXを呼び出してプロセスを実行します。これは実際に行われます(ILSpyを使用してSystem.dllからコピーされます)。
public bool ShellExecuteOnSTAThread()
{
if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
{
ThreadStart start = new ThreadStart(this.ShellExecuteFunction);
Thread thread = new Thread(start);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
}
else
{
this.ShellExecuteFunction();
}
return this._succeeded;
}
UseShellExecute = falseの場合、kernel32.dllのCreateProcessを呼び出してプロセスを開始します。
上記のコードShellExecuteOnSTAThreadが新しいスレッドを作成しているという事実に問題があるかどうか疑問に思いましたか?アプリプールは、間接的にWin32Exceptionを引き起こす可能性のあるスレッドの制限に達する可能性がありますか?