我正在尝试运行ASP。NET MVC(模型-视图-控制器)项目从TFS (Team Foundation Server)源代码控制检索。我已经添加了所有程序集引用,我能够成功地构建和编译,没有任何错误或警告。

但是我在浏览器中得到以下错误:

找不到路径的一部分 “C: \ B8akWorkspace \ B8akProject \ B8akSolution \ B8AK.Portal \ bin \ roslyn \ csc.exe”。

以下是错误页面的完整截图。

经过几天的研究,我了解到Roslyn是一个提供高级编译特性的. net编译器平台。但是,我不明白为什么我的构建试图找到\bin\roslyn\csc.exe,因为我没有配置任何与roslyn相关的东西。我也没打算让罗斯林参与我的项目。


当前回答

安装nudget包:Microsoft.CodeDom.Providers.DotNetCompilerPlatform.BinFix https://www.nuget.org/packages/Microsoft.CodeDom.Providers.DotNetCompilerPlatform.BinFix/1.0.0

其他回答

正如GitHub上Roslyn项目的一个问题所指出的那样,一个解决方案(对我有用)是简单地在Visual Studio中卸载和重新加载项目。

“bin\roslyn”文件夹没有在构建或重新构建时创建,直到我重新加载项目。

默认的VS2015模板的问题是编译器实际上没有复制到{outdir}_PublishedWebsites\tfr\bin\roslyn\目录中,而是复制到{outdir}\roslyn\目录中。这可能与您的本地环境不同,因为AppHarbor使用输出目录构建应用程序,而不是“就地”构建解决方案。

要修复它,在xml块<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">

<PropertyGroup>
  <PostBuildEvent>
    if not exist "$(WebProjectOutputDir)\bin\Roslyn" md "$(WebProjectOutputDir)\bin\Roslyn"
    start /MIN xcopy /s /y /R "$(OutDir)roslyn\*.*" "$(WebProjectOutputDir)\bin\Roslyn"
  </PostBuildEvent>
</PropertyGroup>

参考:https://support.appharbor.com/discussions/problems/78633 -斜面-构建- aspnet - mvc项目生成——从vstudio - 2015企业

您的构建正在试图找到\bin\roslyn\csc.exe,因为以下包已添加到您的项目中。检查一下你的套餐。配置文件,你可以把它们都放在那里

Microsoft.CodeDom.Providers.DotNetCompilerPlatform
Microsoft.Net.Compilers

What is Roslyn and Who added them(packages) in the project : If you’re using .net Framework 4.5.2 to create projects using VS2015, you might have noticed that the project templates use Roslyn by default. Actually, Roslyn is one of open-source compilers for .NET languages from Microsoft. Why should we delete Roslyn : If your project has Roslyn references and you are interested to deploy it on server, you will get unwanted errors on the website as many hosting providers still have not upgraded their servers and hence do not support Roslyn. To resolve this issue, you will need to remove the Roslyn compiler from the project template.

如果你不想利用罗斯林 按照下面的步骤删除它

1. 删除NuGet包,从NuGet包控制台使用以下命令

PM> Uninstall-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
PM> Uninstall-package Microsoft.Net.Compilers

2. 在你完成这些之后,你的网。配置文件应该自动更新。如果不是,请在web中查找下面的代码。配置文件,如果找到,删除这段代码。

<system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"></compiler>
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"></compiler>
    </compilers>
</system.codedom>

其他的答案都对我没用。在做了一个文件夹比较之前/之后与我预期提交的文件,我发现GIT忽略了一个必需的文件夹。如果跟踪存储库中的编译器,请确保跟踪BUILD文件夹。如果不是,编译器将永远不会被构建,并将在发布后抛出这个确切的错误。我在我的.gitignore文件中添加了这一行:

!**/packages/Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.1/build/

现在它可以正确地部署到其他计算机上。

我在运行MSBuild的Jenkins构建服务器上遇到了这个错误,它将构建文件输出到一个单独的文件夹位置(_publhedwebsites)。完全一样- roslyn文件夹不在bin目录中,所有的roslyn文件都集中在bin文件中。

@igor-semin的回答对我来说是唯一有用的(因为我正在使用c# 6语言功能,我不能像其他答案一样简单地卸载nuget包),但由于我也在运行CodeAnalysis,我在部署目标服务器上得到了另一个错误:

检测到试图覆盖名称为“”的Microsoft.CodeAnalysis.ICompilationUnitSyntax类型的现有映射,当前映射为Microsoft.CodeAnalysis.CSharp.Syntax类型。CompilationUnitSyntax,输入Microsoft.CodeAnalysis.VisualBasic.Syntax.CompilationUnitSyntax。

这样做的原因是,当roslyn文件被转储到主bin目录中时,当您运行xcopy在嵌套的roslyn文件夹中重新创建它们时,您现在有两个正在编译的这些文件副本,并且它们之间存在冲突。在经历了很多挫折后,我决定进行一个“黑客”修复-一个额外的构建后任务,从bin目录中删除这些文件,消除冲突。

我的问题项目的.csproj现在看起来像:

...................更多信息请点击这里......................

 <PropertyGroup>
   <PostBuildEvent>
   if not exist "$(WebProjectOutputDir)\bin\Roslyn" md "$(WebProjectOutputDir)\bin\Roslyn"
   start /MIN xcopy /s /y /R "$(OutDir)roslyn\*.*" "$(WebProjectOutputDir)\bin\Roslyn"
 </PostBuildEvent>
</PropertyGroup>
<Target Name="DeleteDuplicateAnalysisFiles" AfterTargets="AfterBuild">
   <!-- Jenkins now has copies of the following files in both the bin directory and the 'bin\rosyln' directory. Delete from bin. -->
   <ItemGroup>
     <FilesToDelete Include="$(WebProjectOutputDir)\bin\Microsoft.CodeAnalysis*.dll" />
   </ItemGroup>
   <Delete Files="@(FilesToDelete)" />
</Target>

...................更多信息请点击这里......................