VBCSCompiler.exe的许多实例
我刚刚下载并安装了Visual Studio Professional 2015(14.0.23107.0)。 我第一次打开我们的解决scheme(28个项目),并执行了Build – > Rebuild Solution,我的开发机器就完全爬了起来。 CPU达到100%,构build从未完成 – 即使在10分钟以上。
我打开Windows任务pipe理器,发现:> 10 VBCSCompiler.exe任务正在运行。 结合起来,这些任务发送CPU> 90%。
任何想法为什么有这么多这些任务运行? 任何方法来阻止这种情况的发生?
这是我能find遇到同样问题的其他人最接近的事情: https : //github.com/dotnet/roslyn/issues/2790
更新(8/7)
– 汉斯·帕斯特,深思熟虑。 我的经理向我提供了这个版本(14.0.23107.0)。 这是“正式版”的正确版本吗? 我不知道安装任何发行版本的Visual Studio 2015.我不认为有任何testing位左右。
-Kyle Trauberman,我不熟悉Visual Studio上下文中的环境variables; 然而,我天真地在VS(和MSBuild)命令提示符窗口中运行set DisableRosyln=true
。 这似乎没有任何影响。 即使重新启动VS2015,VBCSCompiler.exe也显示正确的备份。
我修复了我的VS2015安装并重新启动。 这没有帮助。
更新第2部分(8/7) – 汉斯帕斯特 ,非常令人印象深刻的写! 虽然这个问题没有发生,但我看了一下你所描述的东西:
至于模块加载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参数。 我将不得不等待,直到它再次发生。
嗯,没有明显的repro情况,没有人抱怨这个。 你的解决scheme一点也不奇怪。 把CPU挂到100%,让VBCSCompiler进程吞下〜1.5 GB在一个大项目上不是很难,但是当我看着我的时候,它是干净的。
第一个可能的故障情况是您有一些卸载的beta位,这是一个非常常见的问题。 使用debugging器来看看。 使用debugging>附加到进程并select一个正在运行的实例。 然后Debug> Break All和Debug> View> Modules。 注意版本号和时间戳,它们应该是这样的:
请注意,故意隐藏一些列以保持可读性。 时间戳是CST时区。
这是服务器端。 您发现的错误的客户端位于C:\ Program Files文件(x86)\ MSBuild \ 14.0 \ Bin \ Microsoft.Build.Tasks.CodeAnalysis.dll。 看看它的属性,我的是85,192个字节,创build于2015年6月21日星期日,7:06:54 PM,文件版本号1.0.0.50618。 您可以使用Reflector或ILSpy等反编译器查看文件,导航到BuildClient.TryAllProcesses()。 与错误修复相关的行是:
for (int i = 1; File.Exists(string.Format(@"\\.\pipe\{0}", pipeName)); i++)
buggy版本缺less\\.\pipe\
。
注意在上面的代码片段中错误检查是非常不充分的,File.Exists()返回false的原因很多。 也是错误之前没有被发现的基本原因。 这样可以启用几种可能的失败模式,如果您的机器被程序员自愿安装的典型的缩小打包的恶意软件感染,则启用这种types的失败模式。 服务器和客户端代码通过具有特殊名称的命名pipe道相互连接。 您可以在任务pipe理器,进程选项卡中看到的东西。 使用视图>select列(Win8及以上:右键单击列标题)并勾选“命令行”选项:
请注意-pipename
参数。 如果File.Exists()调用返回false,则MSBuild将再次启动VBCSCompiler.exe。 如果您看到所有这些使用相同-pipename参数运行的实例,那么您的计算机上运行的软件会干扰正常的命名pipe道使用。 首先你要考虑的是寻找一个不太积极的反恶意软件解决scheme。 您可以编写一个使用System.IO.Pipes命名空间的小testing程序来获得更好的exception消息。
任何想法为什么有这么多这些任务运行?
Roslyn使用共享编译器进程,将编译后的代码保存在内存中,以便在随后的编译中重用。 所以第二次编译会更快,但是正如你所看到的那样,有一个内存开销。
任何方法来阻止这种情况的发生?
是。 从这里 ,msbuild中的编译任务的属性closures了共享编译器, 默认情况下它被设置为true。
所以在每个项目中你都必须把这个属性添加到项目文件中。 或者在Visual Studio 2015中,现在有了共享项目,您可以在其中将该属性添加到共享项目,然后将该共享项目包含在所有需要此设置的其他项目中。
<PropertyGroup> <UseSharedCompilation>false</UseSharedCompilation> </PropertyGroup>
截至2015年11月22日,这个问题在Visual Studio 2015社区版中还是发生在我身上。 我的笔记本电脑开始增加一倍的空间加热器,VBCSCompiler的所有实例都在全速运行。
唯一的解决方法是find文件VBCSCompiler.exe在Web应用程序的/ bin / roslyn目录中,并更改它的安全权限 。
您需要拒绝读取和执行您的Web应用程序正在运行的AppPool的权限。
根据Slaks,您可以通过将DisableRoslyn
环境variables设置为true
来禁用roslyn(这是VBCSCompiler.exe似乎是)。
有关更多信息,请参阅http://blog.slaks.net/2014-05-21/exploring-roslyn-part-2-inside-end-user-preview/ 。
请注意,上面的链接是用于预览的,但是我无法想象它会在当前和现在之间发生什么变化。
您需要修改“VBCSCompiler.exe.config”文件(“C:\ Program Files(x86)\ MSBuild \ 14.0 \ Bin \ VBCSCompiler”)以closuresVBCSCompiler。 VBCSCompiler.exe.config“),并以秒为单位设置所需的值(默认为600)。
在Visual Studio Enterprise 2015 Update 1中也遇到了这个问题。通过升级到Update 2解决了这个问题。
我发现在应用程序池高级设置中将标识更改为“NetworkService”为我解决了这个问题。