初回起動時(その3 ビンゴ)

Hikageさんよりコメントで教えて頂いたが、今回の現象はXmlSerializerコマンドプロンプトかcsc.exeを起動した場合に発生する既知だが非常に限定された中での問題のようだ。

XmlSerializer クラスから起動された csc.exe が一定時間応答を停止する場合がある - Microsoft サポートオンライン

これによると問題は内部でcsc.exeとconIme.exeのデッドロックが発生することに起因するとある。
実際にVisual Studio 2005を起動する際にProcess Explorerでプロセスの挙動を観察してみると、以下のようにcsc.exeがイベント待ちになっていることが判る。イベント名からしてIMEが起動するのを待っているのは間違いなさそうだ。

既知の対処方法は、

1. コンソールIMEが起動しないようにレジストリ値を変更する
2. 動的なコンパイルが実行されないようにする

この二つだが今回の場合は実装を変えることはできないので、おのずと1.を選択することになる。(コンソールIMEは使えなくなるがコマンドプロンプトIMEを使う可能性は低いし、問題ないだろう)

実際にレジストリエディタを使って以下のようにコンソールIMEを無効にして、PCを再起動後にVisual Studio 2005を起動してみたが、今度は止まることなく正常に起動するのを確認できた。

最後に、二度目の起動は問題が起きないのは何故かを考えてみたが、初回にハングアップしたdevenv.exeをkillした時に、デッドロックしていたcomIme.exeが起動されたままになるので、二度目はデッドロックの対象にならないのだろう。

ちなみに、上述のサポートページにはこの問題は.NET 1.1が対象と書いてあった。実際には.NET 2.0でも発生するので注意が必要だ。