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运行之外什么也不做。

现在通过运行批处理文件重复测试,编译时间现在是 10000 毫秒(10 秒)。

我已经检查了事件查看器在 VS 打开时发生的任何事情,但在它关闭时没有发生,使用 procmon 和 filemon 来查找文件访问并检查 VS 在打开时是否启用任何服务,所有这些都没有成功/影响.

我什至尝试卸载并重新安装 VS,这解决了前几个版本的问题,但后来又出现了。重启机器没有效果。我没有在 VS 中安装插件。

我的同事机器没有显示这个问题,他们有相同的设置。这一切都在具有 16gb 内存、64 位 win 7 和 SSD 的机器上运行。

有人有任何线索吗?

4

2 回答 2

13

我已经想通了。我相信这是某些恶意软件的结果。我通过以下步骤诊断出问题。

  1. 下载 ProcMon ( http://technet.microsoft.com/en-gb/sysinternals/bb896645.aspx )
  2. 在进程名称上向 ProcMon 添加过滤器:csc.exe
  3. 然后我从命令行运行编译,并打开了 Visual Studio。大概用了10秒,太长了!查看 ProcMon 窗口中的输出,我注意到 csc.exe 似乎暂停了 5 秒,一次是在跟踪开始时,一次是在结束时。请参阅以下屏幕:

开始:

开始

结尾:

结尾

似乎 HKLM\SOFTWARE\Wow6432Node\5c28f8fbc6fe942 的 RegCloseKey 导致 csc.exe 等待 5 秒,两次。

注册密钥:

注册密钥

然后我决定重命名这个条目(在末尾添加 _old),然后我重新编译....BINGO,它在不到 30 毫秒的时间内编译完毕!

在研究了此密钥中包含的条目并进行了一些谷歌搜索后,结果证明此 reg 密钥是某些恶意软件的结果。我使用以下指南删除了恶意软件,现在问题已完全解决。

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 /目标:winexe

要使 CSC.exe 使用这些设置,您可以按如下方式调用它:

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

这告诉 C# 编译器如何命名输出文件以及创建什么样的目标。如您所见,响应文件非常方便,因为您不必在每次编译项目时手动表达所需的命令行参数。

当您安装 .NET Framework 时,它会在 %SystemRoot%\Microsoft.NET\Framework\vX.X.X 目录(其中 XXX 是您安装的 .NET Framework 的版本)中安装一个默认的全局 CSC.rsp 文件。

Visual Studio 2012 使用此默认响应文件来编译代码。因为全局 CSC.rsp 文件引用了所有程序集。引用所有这些程序集可能会使编译器变慢一点。

于 2012-10-24T11:19:18.257 回答