12

午後はみんな、

私は非常に奇妙な問題を抱えています。VS 2012 が開いていると、コンパイル時間が非常に遅くなります。この遅いコンパイル時間は、VS を介してビルドする場合や、コマンド ラインから csc.exe を介して直接ビルドする場合に発生します。

テストするには: 次の項目を含むフォルダーを作成します。

以下を含むバッチ ファイル (compile.bat):

echo %time%
csc /target:library class1.cs
echo %time%

および以下を含む class1.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ClassLibrary1
{
    public class Class1
    {
    }
}

Visual Studio のコマンド プロンプトを開きます。上記のフォルダーに移動し、VS を開かずにバッチ コマンドを実行します。私のマシンでは、これには約 10 ミリ秒かかります。

私は今VS 2012を開き、ソリューションを開かず、devenvが実行されるようにアプリケーションを開く以外は何もしません。

バッチ ファイルを実行してテストを繰り返すと、コンパイル時間は 10000ms (10 秒) になりました。

イベント ビューアーで、VS が開いているときに発生しているが閉じているときに発生していないことを確認し、procmon と filemon を使用してファイル アクセスを探し、VS が開いているときにサービスが有効になっているかどうかを確認しましたが、成功/影響はありませんでした。 .

私はVSをアンインストールして再インストールしようとしました.これは最初のいくつかのビルドの問題を解決しましたが、その後再発しました. マシンを再起動しても効果はありません。VSにプラグインがインストールされていません。

私の同僚のマシンではこの問題は発生せず、セットアップも同じです。これはすべて、16 GB RAM、64 ビット Win 7、および SSD を搭載したマシンで実行されています。

手がかりを得た人はいますか?

4

2 に答える 2

13

私はこれを理解しました。何らかのマルウェアの結果だと思います。次の手順で問題を診断しました。

  1. ProcMon をダウンロードします ( http://technet.microsoft.com/en-gb/sysinternals/bb896645.aspx ) 。
  2. プロセス名 csc.exe の ProcMon にフィルターを追加します。
  3. 次に、ビジュアル スタジオを開いた状態で、コマンド ラインからコンパイルを実行しました。約10秒かかりました、長すぎます!ProcMon ウィンドウの出力を見ると、csc.exe のように見えるものが 5 秒間一時停止していることに気付きました。次の画面を参照してください。

始める:

始める

終わり:

終わり

HKLM\SOFTWARE\Wow6432Node\5c28f8fbc6fe942 への RegCloseKey により、csc.exe が 5 秒間、2 回待機しているように見えました。

登録キー:

登録キー

次に、このエントリの名前を変更することにし (最後に _old を追加)、再コンパイルしました....ビンゴ、30 ミリ秒以内にコンパイルされました!

このキーに含まれるエントリを調査し、グーグル検索を行った結果、このレジストリ キーは何らかのマルウェアの結果であることが判明しました。次のガイドを使用してマルウェアを削除したところ、問題は完全に解決されました。

http://www.explosiveknowledge.net/main/2012/08/19/browsemngr/

上記のガイドには正しい reg エントリが含まれていないことに注意してください。ウイルスはどこかで微調整されたにちがいないと思います。ガイドに記載されている reg エントリが見つかりませんでしたが、見つけたものを単に削除しました。

reg キーの 5c28f8fbc6fe942 の部分はランダムに生成されているように見えることに注意してください。この問題が発生した場合は異なる可能性がありますが、含まれている値は引き続き「ブラウザーマネージャー」について話します。

これが誰かを助けることを願っています!

于 2012-11-19T11:22:04.227 に答える
2

クエリを理解するには、応答ファイルの概念を調べる必要があります。

応答ファイルは、一連のコンパイラ コマンドライン スイッチを含むテキスト ファイルです。CSC.exe を実行すると、コンパイラは応答ファイルを開き、コマンド ラインで CSC.exe にスイッチが渡されたかのように、応答ファイルで指定されているすべてのスイッチを使用します。コマンド ラインで名前の前に @ 記号を付けて指定することにより、コンパイラに応答ファイルを使用するように指示します。たとえば、次のテキストを含む MyProject.rsp という応答ファイルを作成できます。

/out:MyProject.exe /target:winexe

CSC.exe でこれらの設定を使用するには、次のように呼び出します。

csc.exe @MyProject.rsp CodeFile1.cs CodeFile2.cs

これにより、出力ファイルの名前と作成するターゲットの種類が C# コンパイラに伝えられます。おわかりのように、プロジェクトをコンパイルするたびに必要なコマンド ライン引数を手動で表現する必要がないため、応答ファイルは非常に便利です。

.NET Framework をインストールすると、既定のグローバル CSC.rsp ファイルが %SystemRoot%\Microsoft.NET\Framework\vX.X.X ディレクトリ (XXX は、インストールした .NET Framework のバージョン) にインストールされます。

Visual Studio 2012 は、この既定の応答ファイルを使用してコードをコンパイルします。グローバル CSC.rsp ファイルはすべてのアセンブリを参照するため、これらのアセンブリをすべて参照すると、コンパイラの速度が少し低下する可能性があります。

于 2012-10-24T11:19:18.257 に答える