24

約 20 のプロジェクトを含む中規模のソリューションがあります。そのうちの 1 つで、私は自分の事業体を持っています。プロジェクトをコンパイルすると、Visual Studio はこの BusinessEntities プロジェクトで約 1 分半待機してハングします。

SharpDevelop でソリューションを試してみたところ、18 秒で完全なソリューションがコンパイルされました。MSBuild と同様のタイミング。

私の推測では、VS はプロジェクトにコンパイルが必要かどうかを調べようとしていますが、このプロセスは実際にコンパイルを実行するよりも約 15 倍遅くなります!!

優れた Sharpdevelop に切り替えることはできません。これには、デバッグ シナリオに必要な小さいながらも不可欠な要件がいくつか欠けています。

VS がこのプロジェクトをチェックしないようにすることはできますか?

一部のプロジェクトのビルドを防ぐために構成管理でプロジェクトのチェックを外すことについては既に知っていますが、私の開発者は、最新のソースに更新した後にこのプロジェクトをコンパイルする必要があることを忘れてしまい、奇妙に思える問題に直面します。

編集: 調査の興味深い結果: 遅延はプロジェクトの 1 つにのみ発生します。構成マネージャーで、すべてのプロジェクトのチェックを外し、それぞれを個別にコンパイルしました。すべてのプロジェクトは数秒でコンパイルされます!! 要点は次のとおりです。その特別なプロジェクトが直接ビルドされている場合、数秒でコンパイルされます。それに依存する別のプロジェクトをビルドした結果としてビルドされている (または最新であるためスキップされている) 場合、VS約 1 分半ハングした後、コンパイル (またはスキップ) することを決定します。私の結論: Visual Studio はファイルが変更されたかどうかを確認していますが、何らかの理由で、この特別なプロジェクトでは非常に非効率的です!!

4

11 に答える 11

10

Tools -> Options -> Projects and Solutions -> Build and Run「MSBuild project build [output|build log] verbosity」を Diagnostic に変更します。そのレベルでは、問題の追跡に役立つタイミングが含まれます。

于 2012-08-26T05:19:35.850 に答える
3

現在コンパイル中のプロジェクトのために、VS が他の新しくビルドされたアセンブリを検査することに苦しんでいる可能性があります。

アセンブリがビルドされると、VS はターゲット アセンブリの参照を検査します。それらが完全にビルドされているか、新しいバージョンである場合は、.Net ドメインに実際にロードすることが含まれる場合があります。それを実行するつもりです。ビルドは、再ビルドするプロジェクトが増えるにつれて、徐々に遅くなる可能性があります。1 つのアセンブリが新しくなると、他のアセンブリはより多くの作業を行います。これは、単独で構築する場合と、既に構築されている場合と、クリーンに構築する場合とで、一見関連性のある異なる結果が得られる理由の 1 つの考えられる説明です。コンパイルされているものについてではなく、他のものが変更されたことは本当にそうです。

VS は、参照されたアセンブリの最後の「内部」ビルド番号を「マークダウン」し、参照されたアセンブリがビルド プロセスを実行するときに実際に変更されたかどうかを確認します。違いがなければ、大量の作業がスキップされます。はい、制御できない内部アセンブリ ビルド番号があります。これは、実際の c# コンパイラやその作業、またはコンパイル後の何かが原因である可能性は決して高くありませんが、最も一般的なケースで必要なコンパイル前の手順です。

操作できる参照指向の設定がいくつかあります。開発、テスト、または展開のニーズによっては、機能の違いは無関係かもしれませんが、VS の動作方法とビルド中にかかる時間に大きな影響を与える可能性があります。

ソリューション エクスプローラーでいずれかのプロジェクトの参照に移動します。

1) 参照をクリックします

2)そうでない場合はプロパティペインを開きます(プロパティページまたはプロパティマネージャーではありません)

3) 'Copy Local'、'Embed Interop Types'、'Reference Output Assembly' を見てください。それらは非常に適用可能であり、おそらく知っておくとよいでしょう。MSDN で彼らが何をしているのかを調べることを強くお勧めします。「参照出力アセンブリ」は、リストに表示される場合と表示されない場合があります。

4) プロジェクトをアンロードし、VS で .proj ファイルをテキストとして編集します。XML でアセンブリ参照を探し、「プライベート」を探します。これは、参照されているアセンブリが、共有アセンブリではなく、参照アセンブリの観点からプライベート アセンブリであるかのように扱われるかどうかを意味します。これはちょっと言い方が悪いですが、そのアセンブリは、他のアセンブリと一緒にユニットとして展開されます。これは、負担を軽減する上で非常に重要です。背景: http://msdn.microsoft.com/en-us/magazine/cc164080.aspx


したがって、ここでの基本的な考え方は、ビルド中とデプロイ後の両方で、これらすべてを最も安価になるように構成することです。たとえば、それらを一緒に構築している場合、「ローカルにコピー」はおそらく本当に必要ありません。ニーズについて詳しく知らずに、それらをどのように構成する必要があるかについてこれ以上言うのは嫌ですが、それぞれについていくつかの優れた段落を読むことは非常に良いことです. ただし、参照されたものが再構築される前に解決するときに、VS が古くなった古いものを使用するかどうかにも影響するため、これは非常に注意が必要です。これらについて読むのが良いことを説明する別の例として、Copy Localは次のことができます。古いものであってもローカルコピーを使用するため、このセットを持つことは二重に悪い可能性があります。現時点での目標は、VS が新しくビルドされたアセンブリ jsut をロードして他のアセンブリをコンパイルする負担を軽減することであることを覚えておいてください。

最後に、今のところ、わずか 1.5 分のハングアップは非常に幸運であると簡単に言えます。このようなことにより、ビルド時間がはるかに悪い人がいます;)

于 2012-09-01T04:57:16.277 に答える
1

個々のプロジェクトが正しくコンパイルされている場合は、構成で依存プロジェクトを明示的に設定して、コンパイルの順序を変更するだけです。

プロジェクトの依存関係の階層を視覚化し、依存関係のあるプロジェクトを設定してみてください。たとえば、ビジネスエンティティプロジェクトが各プロジェクトで参照されている場合、各プロジェクトの構成では、このプロジェクトを依存として選択する必要があります。

明示的なビルド順序が設定されていない場合、VisualStudioはプロジェクトを分析してプロジェクトのビルド順序を作成します。明示的な依存プロジェクトwikiを設定すると、Visual Studioはこの手順をスキップし、指定された順序を使用します。

于 2012-08-31T07:41:04.807 に答える
1

1 つのプロジェクトでこのような極端な遅延が発生し、他に理由がないように思われるため、 sysinternalsから procmonを実行しながらその特定のプロジェクトをビルドし、すべての成功メッセージを除外しようとしました。おそらく、ファイル システム アクションだけに絞り込むこともできます。あなたの説明から、ファイルはイベント コレクションやワークフロー管理プロセス サービスなどの外部ソースによってロックされていると推測できます。

他に考慮すべきことは、これが完全にクリーンなビルド マシンであるかどうか、またはビルドのテストにも使用されているかどうかです。その場合、誰かが IIS アプリケーション パスをプロジェクトに直接マップしたり、サービスの場所として登録した可能性はありますか?

procmon を実行しても明らかなロックや競合が見られない場合は、まったく新しいソリューションとプロジェクトを作成し、ファイルをコピーして、そのプロジェクトにも同じ遅延があるかどうかを確認します。同じ遅延がある場合は、同じタイプで汎用データ (本質的には空) のサンプル プロジェクトを作成し、それも遅いかどうかを確認します。同じファイルを含む新しいプロジェクトが正常にビルドされた場合は、ディレクトリを比較して、問題の原因となっている差異を確認できます (おそらく構成またはプロジェクト設定)。

于 2012-09-01T02:27:44.640 に答える
1

言及されていないいくつかのトラブルシューティングのアイデア:

  • クリーンソリューション?

  • Obj および Bin フォルダを削除しますか? 参考までに、Clean も Rebuild もビルド前のコマンドでコピーされたファイルなど、非ビルド ファイルを削除しません。

  • 外部ファイルの VS スキャンをオフにします。オプション>ツール>環境>ドキュメント>ファイルが環境外で変更されたときを検出しますか?

  • SVN履歴をロールバックして、いつ発生し始めたかを確認しますか? 何が変わったのですか?1 日目のプロジェクト ファイルに同じ時間がかかる場合は、プロジェクトを再作成し、すべてのファイルを追加してビルドします。

そうでない場合は、Process Monitor を実行して、Visual Studio が prep-build 段階で何を行っているかをお知らせください。

于 2012-08-27T00:54:39.373 に答える
1

提供された (限られた) 情報に基づいて、1 つの可能性は、コンパイルが遅いプロジェクト ファイルで指定されたビルド前のアクションが存在する可能性があることです。

于 2012-08-29T21:14:34.457 に答える
1

ばかげているように聞こえますが、最初にすべてのブレークポイントを削除してください。ビルド前のチェックが大幅に高速化されましたが、理由はまだわかりません。

于 2012-08-25T13:52:17.940 に答える
1

ここで説明されているように、プラットフォーム検証タスクを無効にしてみてください。

于 2012-08-31T03:40:41.353 に答える
1

他の誰かがこの問題に遭遇した場合に備えて:

私の場合、遅延は、アクセスできない UNC の場所を参照する「追加のインクルード ディレクトリ」の無効なパスエントリが原因でした。

これが修正されると、遅延はなくなりました。

于 2020-03-28T20:29:43.643 に答える