我刚刚下载并安装了Visual Studio Professional 2015(14.0.23107.0)。我第一次打开我们的解决方案(28个项目)并执行了Build - >重建解决方案,我的开发机器出现了绝对的爬行。 CPU的最大值为100%,构建永远不会完成 - 即使在>之后10分钟。
我打开了Windows任务管理器并注意到:> 10个VBCSCompiler.exe任务正在运行。当组合时,这些任务发送CPU> 90%。
知道为什么有这么多这样的任务在运行?有什么方法可以阻止这种情况发生吗?
这是我能遇到同样问题的其他人最接近的事情:https://github.com/dotnet/roslyn/issues/2790
更新(8/7)
-Hans Passant,很棒的想法。我的经理向我提供了这个版本(14.0.23107.0)。这是"正式版本的正确版本" ??我没有故意安装任何Visual Studio 2015的每个版本。我不认为有任何beta版本。
-Kyle Trauberman,我对Visual Studio环境中的环境变量并不熟悉;但是,我天真地在VS(和MSBuild)命令提示符窗口中运行set DisableRosyln=true
。这似乎没有任何影响。即使重启VS2015,VBCSCompiler.exe也会显示正确的备份。
我修复了我的VS2015安装并执行了重启。这没有用。
更新第2部分(8/7) -Hans Passant,非常令人印象深刻的写作!虽然这次问题没有发生,但我看了你所描述的事情:
对于加载了VBCSCompiler.exe的模块,这里有我所拥有的:
有趣的是,我们的.NET核心程序集有不同的版本。你是4.06.79而我是4.06.81。
我的客户端dll" (位于C:\ Program Files(x86)\ MSBuild \ 14.0 \ Bin \ Microsoft.Build.Tasks.CodeAnalysis.dll)与您的版本和时间戳相同:
奇怪的是,当我查看ILSpy中的代码时,我看到了一些略有不同的东西 - 也许是优化?
private static NamedPipeClientStream TryAllProcesses(string pipeName, int timeoutMs, CancellationToken cancellationToken, out string newPipeName)
{
string str = pipeName;
int num = 1;
while (File.Exists(string.Format("\\\\.\\pipe\\{0}", pipeName)))
{
NamedPipeClientStream result;
if ((result = BuildClient.TryConnectToProcess(pipeName, timeoutMs, cancellationToken)) != null)
{
newPipeName = pipeName;
return result;
}
pipeName = str + "." + num.ToString(CultureInfo.InvariantCulture);
num++;
}
newPipeName = pipeName;
return null;
}
**让我回复一下传递给VBCSCompiler.exe实例的特定pipname参数。我将不得不等到它再次发生。
答案 0 :(得分:20)
第一种可能的故障情况是你有一些未安装的beta位,这是一个非常常见的问题。使用调试器进行查看。使用Debug>附加到Process并选择一个正在运行的实例。然后调试>全部中断和调试>查看>模块。注意版本号和时间戳,它们应该是这样的:
请注意,故意隐藏一些列以保持其可读性。时间戳是CST时区。
那是服务器端。遇到错误的客户端位于C:\ Program Files(x86)\ MSBuild \ 14.0 \ Bin \ Microsoft.Build.Tasks.CodeAnalysis.dll。看看它的属性,我的是85,192字节,创建于2015年6月21日星期日,下午7:06:54,文件版本号1.0.0.50618。您可以使用Reflector或ILSpy等反编译器查看该文件,导航到BuildClient.TryAllProcesses()。错误修复的相关行是:
for (int i = 1; File.Exists(string.Format(@"\\.\pipe\{0}", pipeName)); i++)
错误版本缺少\\.\pipe\
。
请注意,上述代码段中的错误检查非常不合适,File.Exists()返回 false 的原因有很多。这个错误的基本原因也是之前没有发现的。这可以实现几种可能的故障模式,如果您的计算机被程序员自愿安装的典型收缩包装恶意软件感染,则启用该类型。服务器和客户端代码通过具有特殊名称的命名管道相互连接。您可以在任务管理器,进程选项卡中看到的内容。使用视图>选择列(Win8及以上:右键单击列标题)并勾选"命令行"选项:
注意-pipename
参数。如果File.Exists()调用返回 false ,则MSBuild将再次启动VBCSCompiler.exe。如果您看到所有这些实例都使用相同的-pipename参数运行,那么您的计算机上运行的软件会干扰正常的命名管道使用。您首先要考虑的是寻找一种不太积极的反恶意软件解决方案。您可以编写一个使用System.IO.Pipes命名空间的小测试程序来获得更好的异常消息。
答案 1 :(得分:20)
知道为什么有这么多这样的任务在运行?
Roslyn使用共享编译器进程,将编译后的代码保存在内存中,以便在后续编译中重用。所以第二次编译会更快,但是你已经看到了内存开销。
有什么方法可以阻止这种情况发生?
是。从here开始,msbuild中的编译任务的属性关闭共享编译器,并且default将其设置为true。
因此,在每个项目中,您都必须将此属性添加到项目文件中。或者在Visual Studio 2015中,现在共享项目,您可以将此属性添加到共享项目,然后在需要此设置的所有其他项目中包含该共享项目。
<PropertyGroup>
<UseSharedCompilation>false</UseSharedCompilation>
</PropertyGroup>
答案 2 :(得分:7)
截至2015年11月22日,Visual Studio 2015社区版本中仍然出现了这个问题。我的笔记本电脑开始兼作空间加热器,VBCSCompiler的所有实例全速运行。
唯一对我有用的解决方法是在Web应用程序的/ bin / roslyn目录中找到文件VBCSCompiler.exe,并在其上更改安全权限。
您需要拒绝阅读&amp;执行运行Web应用程序的AppPool的权限。
答案 3 :(得分:2)
According to Slaks, you can disable roslyn (which is what the VBCSCompiler.exe appears to be) by setting the DisableRoslyn
environment variable to true
.
See http://blog.slaks.net/2014-05-21/exploring-roslyn-part-2-inside-end-user-preview/ for more information.
Note, the link above is for the preview, but I can't imagine that it would have changed much between then and now.
答案 4 :(得分:1)
您还可以更改&#34;保持活力&#34; VBCSCompiler的选项,在执行后关闭它... 你需要修改&#34; VBCSCompiler.exe.config&#34;文件(&#34; C:\ Program Files(x86)\ MSBuild \ 14.0 \ Bin \ VBCSCompiler.exe.config&#34;)并以秒为单位设置所需的值(默认情况下为600)。
答案 5 :(得分:0)
还在Visual Studio Enterprise 2015 Update 1中遇到此问题。 通过升级到Update 2解决了这个问题。
答案 6 :(得分:0)
我发现在应用程序池高级设置中将身份更改为“NetworkService”为我解决了问题。