在构建服务器中构建Web应用程序时"无法找到CodeDom提供程序类型Microsoft.VisualC.CppCodeProvider"异常

Art*_*nes 24 c# asp.net msbuild teamcity build-server

我正在构建服务器中构建/打包Web应用程序,但它失败并出现以下异常:

ASPNETCOMPILER错误ASPCONFIG:无法找到CodeDom提供程序类型"Microsoft.VisualC.CppCodeProvider,CppCodeProvider,Version = 10.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a".

构建服务器:

  • Windows Server 2008 R2标准版
  • TeamCity 8.0.4
  • .NET 4.5
  • Windows SDK for Windows 7和.NET 4
  • Windows SDK for Windows 8和.NET 4.5
  • 便携式类库工具
  • ASP MVC 4

该应用程序是一个ASP MVC 4 Web应用程序,面向.NET 4.5.

构建配置包括使用MSBuild构建解决方案,允许部署到包,以便稍后发布.

通过TeamCity的日志,我可以看到当MSBuild运行"aspnet_compiler.exe"时出现错误.

构建在我的开发机器中没有问题,也可以毫无问题地将它发布到本地IIS.

有谁知道导致这个问题的原因是什么?

UPDATE

请参阅下面的答案.

小智 57

对我来说,在构建Web项目时,VS2017中出现了这个错误.解决方法是在文件资源管理器中隐藏node_modules目录.显然,这会阻止ASP.NET编译器扫描所有这些文件,从而防止出错.


Art*_*nes 29

这篇文章给了我一个重要的线索:显然ASP.NET预编译会扫描项目和输出文件,并尝试编译它找到的每个源文件,尽管它的语言(见这里).

在这种情况下,我的Web应用程序依赖于一个项目,该项目包含一些".h"文件中的非托管dll.这些文件被复制到输出目录("如果更新则复制"),所以我可以在运行时将其解除.

似乎ASP.NET预编译找到".h"并尝试编译它,即使不需要它.而且,在我看来,它失败,因为我的构建服务器不具有作业的工具(它看起来像CppCodeProvider自带.NET 2.0 SDK).

当我更改项目而不是将这些文件复制到输出目录时,构建运行正常.我还测试了复制文件,但在发布配置文件中将"PrecompileBeforePublish"设置为false,它也有效.

现在我有一些选择,但我不喜欢它们中的任何一个:

  • 禁用"PrecompileBeforePublish".我认为主要的缺点是应用程序用户体验在第一次访问网站时会变慢.

  • 尝试从输出文件夹中排除文件,并在预编译后再次添加它们.对于我不应该首先担心的事情来说,这似乎有很多工作要做.

  • 尝试告诉"aspnet_compiler.exe"在执行时排除有问题的文件/文件夹.我不知道如何使用发布配置文件,因为我只能控制"PrecompileBeforePublish".此外,似乎"aspnet_compiler.exe"不提供该选项(此处此处).

我想现在我将禁用"PrecompileBeforePublish",因为它似乎是一条快速的道路,几乎没有任何警告.但我相信应该有更好的方法来处理它,使用发布配置文件从预编译中排除文件夹或文件类型.

  • 这个信息是金色的!我们的前端有一个`node_modules`文件夹,这会导致问题,因为某些模块包含不适用于Visual Studio的c文件和头文件.避免此错误的唯一方法是让msbuild删除该文件夹. (7认同)
  • @Edward我也碰到了这个.到目前为止,我已经运气好了,在运行aspnet_compiler.exe然后重置隐藏属性之前,在我的构建脚本中用隐藏属性(`attrib + H c:\ path\to\problem\directory`)标记我的无编译必需文件夹当它完成. (4认同)

Dan*_*ohr 20

为了那些后来在谷歌上找到这个的人的利益......

根本原因

正如错误所暗示的那样,无法找到程序集“Microsoft.VisualC.CppCodeProvider”。

这已作为 Visual Studio 2015 安装的一部分添加到全局程序集缓存 (GAC),但未添加到 Visual Studio 2017。

修复

正确的解决方法是添加对 GAC 的缺失引用。

以管理员身份运行“开发人员命令提示符”,然后运行以下命令

gacutil /i "path to CppCodeProvider.dll" 或者 gacutil /i "C:\Program Files (x86)\Microsoft Visual Studio\2 017\Professional\Common7\IDE\PublicAssemblies\CppCodeProvider.dll"

例如


C:\Windows\System32>gacutil /i "C:\Program Files (x86)\Microsoft Visual Studio\2
017\Professional\Common7\IDE\PublicAssemblies\CppCodeProvider.dll"
Microsoft (R) .NET Global Assembly Cache Utility.  Version 4.0.30319.0
Copyright (c) Microsoft Corporation.  All rights reserved.

Assembly successfully added to the cache

C:\Windows\System32>
Run Code Online (Sandbox Code Playgroud)

在下一次构建时不再抛出以下错误。

ASPNETCOMPILER 错误 ASPCONFIG:无法找到 CodeDom 提供程序类型“Microsoft.VisualC.CppCodeProvider、CppCodeProvider、Version=10.0.0.0、Culture=neutral、PublicKeyToken=b03f5f7f11d50a3a”。

  • 如果根本没有 CppCodeProvider.dll 怎么办?这似乎是可以解决我的问题的答案,但是在搜索了整个 C: 驱动器后,我发现我在任何地方都没有 .dll。 (2认同)

Nic*_*ula 7

当我更新到VS2017时,这种情况就开始发生了.我的问题是node.js,如果我删除了node_modules文件夹,那么项目将构建没有错误.事实证明,改变MvcBuildViews的在的csproj文件假值由Anders的建议在这里修复它.这并不理想,因为在IIS呈现之前不会编译mvc视图.就个人而言,我只是隐藏了node_modules文件夹来解决这个问题,但我想添加这个答案,以防它有助于为其他人提供一些基础问题.

<MvcBuildViews>false</MvcBuildViews>


swa*_*eph 6

在我的情况下,我在我的解决方案中添加了一个有角度的网站,这导致了这个错误。

通过以下步骤解决了错误。

在菜单栏上,选择“构建 > 配置管理器”。

在项目上下文表中,排除 angular 网站(其中包含 node_modules)

在项目的 Build 列中,清除复选框。

选择关闭按钮,然后重新生成解决方案。