2011-07-21 19 views
1

長時間実行しているカスタムビルドタスクがいくつかあります。しかし、Visual Studioには、UIスレッドでmsbuildタスクが実行されるため、IDEがハングしていました。Msbuildに関する質問

私はGoogleで少し検索しましたが、私が見つけた最高のものは、「ああ、それは問題です。それは後で修正するかもしれません。

http://connect.microsoft.com/VisualStudio/feedback/details/670873/visual-studio-ui-freezes-during-long-msbuild-task

http://social.msdn.microsoft.com/Forums/en-US/msbuild/thread/3289eb7d-7989-4350-8c43-02bf9913edbd/。彼らは、Visual Studioの内部で実行されているときを検出

  1. だから、私はで私のカスタムタスクのためにそれを修正することを決めました。

  2. バックグラウンドスレッドでタスクを実行する場合
  3. UIスレッドに「MsgWaitForMultipleHandles/Custom message pump」を追加して、実行中にUIを応答可能にします。

これは動作するようです。私はIDEがフリーズすることなくビルドを実行できるようになりました。いずれの場合においても

、これはいくつかの質問育っ:

  1. を行うには、これは安全ですか?ビジュアルスタジオは大規模なものです。もし私がこれをしたら、私は再入国の問題にぶつかるのだろうか?それらの再入国の問題は、世界を終わらせるか、私はそれらを無視して逃げることができますか?

  2. this postで概説されている技術を使用してVisual Studioを検出しました。基本的には、 "BuildingInsideVisualStudio"プロパティの値をタスクのプロパティに割り当てます。これはExecute()メソッドをチェックします。それが本当であれば、私はマルチスレッドの動作を使用します。それ以外の場合は、順次動作を使用します。しかし、これは、それぞれのターゲットが、suckynessを避けるためにmsbuildファイルに余分なgooを入れるというタスクを使用する必要があります。理想的には、特別な構成をせずに、「吸いたくない」ことを通常の行動にしたいと思います。私のタスクのExecute()メソッドの中でVisual Studioを検出できる方法はありますか?タスクの実装でプロジェクトプロパティを読むことはできますか?XMLをカスタム編集する必要はありませんか?どういうわけかホストオブジェクトを調べることはできますか?

ありがとう。

+1

私は「宇宙の終わり」の部分の質問を読んで、disapointed –

+0

うわー。デベロッパーに長時間のビルドサイクルをさせますか? –

+0

私はそれが皮肉だと思いますか?いずれにしても...「長時間実行」とは、IDEがブロックされているときと、ペイントしないときとでは応答が異なるときの何かが異なることを意味します。私たちの完全なビルドは約5分かかりますが、それほど遅くはありません。私の最後の仕事で完成したビルドは約半日かかりました。また、1日で複数のビルドラボで製品をビルドする必要があるプロジェクトにも取り組んできました。だから、私たちは開発者に長いビルドを課すことはありません。しかし私は自分のプロジェクトに取り組んでいる人々がツールを生産的に使うことを望んでいます。応答していない==生産的ではありません。 –

答えて

1

環境変数MSBuildNoInProcNodeを1に設定してからIDEを起動してください。これにより、IDEビルド要求が子ノードに強制されます。これは十分にテストされたシナリオではないため、予期しない動作が発生する可能性がありますが、プロジェクトファイルやカスタムタスクを変更することなく、結果を得るための代替手段となる可能性があります。

+0

提案していただきありがとうございます。私のカスタムタスクはすべて共通の基本クラスを持っているので、タスクを1か所で変更するだけでした。 理想的には、Visual Studioを別の方法で起動することを避けたいと思います(これは、xmlにgooを追加するよりも簡単です)。 –