簡體   English   中英

找不到部分路徑... bin\roslyn\csc.exe

[英]Could not find a part of the path ... bin\roslyn\csc.exe

我正在嘗試運行從 TFS (Team Foundation Server) 源代碼管理中檢索到的 ASP.NET MVC(模型-視圖-控制器)項目。 我已經添加了所有程序集引用,並且能夠在沒有任何錯誤或警告的情況下成功構建和編譯。

但是我在瀏覽器中收到以下錯誤:

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

這是錯誤頁面的完整屏幕截圖。

在此處輸入圖像描述

經過幾天的研究,我了解到Roslyn是一個提供高級編譯功能的 .NET 編譯器平台。 但是,我不明白為什么我的構建試圖找到 \bin\roslyn\csc.exe,因為我沒有配置與 Roslyn 相關的任何內容。 我也不打算在我的項目中使用 Roslyn。

TL; 博士

在包管理器控制台中運行它:

Update-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform -r

更多信息

此問題與 Visual Studio 本身無關,因此建議添加構建步驟以復制文件的答案是一種解決方法。 與手動將編譯器二進制文件添加到項目中相同。

Roslyn 編譯器來自 NuGet 包,並且該包的某些版本中存在/曾經存在錯誤(我不確切知道哪些版本)。 解決方案是將該軟件包重新安裝/升級到無錯誤版本。 最初在我在 2015 年寫下答案之前,我通過在特定版本中安裝以下軟件包來修復它:

  • Microsoft.Net.Compilers 1.1.1
  • Microsoft.CodeDom.Providers.DotNetCompilerPlatform 1.0.1

然后我查看了 .csproj 並確保包的路徑是正確的(在我的情況下是 ..\..\packages\*.*)在頂部的標簽<ImportProject>和名稱為“EnsureNuGetPackageBuildImports”的<Target>中底部。 這是在 MVC 5 和 .NET Framework 4.5.2 上。

默認 VS2015 模板的問題是編譯器實際上並沒有復制到tfr\bin\roslyn\目錄,而是{outdir}\roslyn\目錄

將此代碼添加到您的 .csproj 文件中:

<Target Name="CopyRoslynFiles" AfterTargets="AfterBuild" Condition="!$(Disable_CopyWebApplication) And '$(OutDir)' != '$(OutputPath)'">
    <ItemGroup>
      <RoslynFiles Include="$(CscToolPath)\*" />
    </ItemGroup>
    <MakeDir Directories="$(WebProjectOutputDir)\bin\roslyn" />
    <Copy SourceFiles="@(RoslynFiles)" DestinationFolder="$(WebProjectOutputDir)\bin\roslyn" SkipUnchangedFiles="true" Retries="$(CopyRetryCount)" RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)" />
</Target>

清潔和重建對我有用!

您的構建正在嘗試查找\bin\roslyn\csc.exe ,因為以下軟件包已添加到您的項目中。 只需查看您的packages.config文件,您可以同時擁有它們

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

什么是 Roslyn 以及誰在項目中添加了它們(包):如果您使用 .net Framework 4.5.2 使用 VS2015 創建項目,您可能已經注意到項目模板默認使用 Roslyn。 實際上,Roslyn 是 Microsoft 的 .NET 語言的開源編譯器之一。

我們為什么要刪除 Roslyn :如果您的項目有 Roslyn 引用並且您有興趣將其部署在服務器上,您將在網站上收到不需要的錯誤,因為許多托管服務提供商仍未升級其服務器,因此不支持 Roslyn。 要解決此問題,您需要從項目模板中刪除 Roslyn 編譯器。

如果您對使用 Roslyn 不感興趣,請按照以下步驟將其刪除

1.刪除 NuGet 包,使用 Nuget 包控制台中的以下命令

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

2.完成此操作后,您的 web.config 文件應該會自動更新。 如果不是,請在web.config文件中查找以下代碼,如果找到,請刪除這段代碼。

<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>

這是執行此操作的更多 MSBuild 方式。

<Target Name="CopyRoslynFiles" AfterTargets="AfterBuild" Condition="!$(Disable_CopyWebApplication) And '$(OutDir)' != '$(OutputPath)'">
    <ItemGroup>
      <RoslynFiles Include="$(CscToolPath)\*" />
    </ItemGroup>
    <MakeDir Directories="$(WebProjectOutputDir)\bin\roslyn" />
    <Copy SourceFiles="@(RoslynFiles)" DestinationFolder="$(WebProjectOutputDir)\bin\roslyn" SkipUnchangedFiles="true" Retries="$(CopyRetryCount)" RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)" />
</Target>

但我注意到 roslyn 文件也在我的 bin 目錄中(而不是在文件夾中)。 不過,該應用程序似乎可以工作。

答案為時已晚,但仍然發布它可以幫助任何人。
按照以下步驟為我修復了錯誤:

  1. 刪除包文件夾
  2. 打開VS
  3. 重建
  4. 觀察 NuGet 包已恢復,但 bin\roslyn 未創建
  5. 卸載項目
  6. 重新加載項目
  7. 重建
  8. 觀察 bin\roslyn 現在已創建。

正如GitHub 上 Roslyn 項目中的一個問題所述,一個解決方案(對我有用)是在 Visual Studio 中簡單地卸載和重新加載項目。

在我重新加載項目之前,不會在構建或重建時創建“bin\roslyn”文件夾。

0. 快速修復

正如在當前投票率最高的答案中已經指出的那樣,快速修復是使用包管理器Tools > Nuget Package Manager > Package Manager Console來運行

Update-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform -r

Packet Manager Console - how to open

1.重現錯誤的代碼

這是重現錯誤的代碼:
https://user.it.uu.se/%7Ehesc0353/SrvrErr-reproduce.zip
(原文來自https://github.com/aspnet/AspNetDocs/tree/master/aspnet/web-api/overview/advanced/calling-a-web-api-from-a-net-client/sample/server/ProductsApp )

考慮嘗試上面 zip 文件中提供的示例代碼。
如果未進行任何更改, Ctrl + F5將重現錯誤。

Server Error '/' in Application

2. 更強大的解決方案

另一種解決方案是從項目的Web.config文件中刪除一個屬性。
Web.config.csproj文件位於同一目錄中。)
如果它們丟失,這將自動且靜默地重新創建您的包。

在文本編輯器或 Visual Studio 中打開Web.config文件。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings></appSettings>
  ...
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701"/>
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
    </compilers>
  </system.codedom>
</configuration>

在標簽配置> system.codedom > compilers > compiler language="c#;cs;csharp"中,完全移除type屬性。 – 簡而言之,刪除以type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, . 1開頭的行

Visual Studio 將負責其余的工作。 Server Error in '/' Application

3. HTTP 錯誤 403

在上面提供的示例中,現在按 Ctrl + F5將導致HTTP 錯誤 403

HTTP Error 403.14 - Forbidden

嘗試將 Web 瀏覽器中的 http://localhost: http://localhost:64195替換為http://localhost:64195/api/products Web API 現在可以正確顯示:

A web API containing products


作為一種挑釁,我嘗試從 Visual Studio 項目中刪除整個package目錄。
項目一重建,它就會自動、靜默地重建。

參考


1據推測,相同的修復程序適用於 Visual Basic 和 C#,但我還沒有嘗試過。

我按照這些步驟操作,效果很好

  • 刪除所有 bin 和 obj 文件夾
  • 清理解決方案並重建
  • 在 powershell 中運行此命令

Update-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform -r

我在運行項目時也遇到了同樣的問題。 這是我遵循的步驟。

  1. 右鍵單擊解決方案
  2. 選擇清潔解決方案
  3. 清理成功后,再次構建您的項目
  4. 再次運行項目

這次我沒有看到同樣的錯誤。 這按預期工作。

在嘗試了所有沒有雪茄的修復后,我通過在 Visual Studios 中更新這個 Nuget 包來修復它:

Microsoft.CodeDom.Providers.DotNetCompilerPlatform

我的是從 1.0.0 到 2.0.0 供參考(錯誤不再顯示)

  1. 清潔解決方案
  2. 重建解決方案,這兩個步驟對我有用。

對於 VS 2019,完全刪除以下節點:

<system.codedom>
</system.codedom>

NuGet 包管理器

您需要安裝 Microsoft.CodeDom.Providers.DotNetCompilerPlatform.BinFix,專為該錯誤創建

  • 右鍵單擊您的項目並選擇管理 Nuget 包
  • 找到“Microsoft.CodeDom.Providers.DotNetCompilerPlatform”
  • 只需更新到較舊或較新的版本(不管哪個),然后再次更新回您的原始版本。

這將重新安裝包的所有依賴項和文件(如 csc.exe)

Nuget - DotNetCompilerPlatform

就我而言,在嘗試任何其他解決方案之前,我切換到“發布”配置,重建(文件夾已創建),然后切換回“調試”,而文件夾保持不變。

這是從舊解決方案的源代碼控制中簽出的,顯然原始(自動)包還原和構建項目並未在 bin 目錄中創建該文件夾。

請注意,在撰寫本文時,被指責的組件已達到 v.2。

更新 nuget 包對我有用 右鍵單擊​​解決方案 > 管理 NuGet 包以獲取解決方案並更新所有包,特別是: Microsoft.Net.CompilersMicrosoft.CodeDom.Providers.DotNetCompilerPlatform

所以, Rob Cannon 的回答基本上對我有用,但我不得不調整一些選項。 具體來說,我必須刪除目標上的條件,並更改 Include 屬性,因為在我們的構建服務器上構建項目時,$CscToolPath 是空的。 奇怪的是,在本地運行時 $CscToolPath 不是空的。

<Target Name="CopyRoslynFiles" AfterTargets="AfterBuild" >
  <ItemGroup>
    <RoslynFiles Include="$(SolutionDir)packages\Microsoft.Net.Compilers.1.1.1\tools\*" />
  </ItemGroup>
  <MakeDir Directories="$(WebProjectOutputDir)\bin\roslyn" />
  <Copy SourceFiles="@(RoslynFiles)" DestinationFolder="$(WebProjectOutputDir)\bin\roslyn" SkipUnchangedFiles="true" Retries="$(CopyRetryCount)" RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)" />
</Target>

這是Microsoft.CodeDom.Providers.DotNetCompilerPlatform 1.0.6 的一個已知問題 降級到 1.0.5 為我解決了這個問題。

就我而言,當 Jenkins 嘗試在 Octopus 中部署它時遇到以下錯誤:

MSBUILD : OctoPack error OCT-1676060969: Failed to build the path for '\bin\roslyn\csc.exe' relative to 'T:\workspace\machine.engine\Machine.engine.Test': Invalid URI: The format of the URI could not be determined.. See the inner exception for more details. [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
MSBUILD : OctoPack error OCT-1676060969: System.Exception: Failed to build the path for '\bin\roslyn\csc.exe' relative to 'T:\workspace\machine.engine\Machine.engine.Test': Invalid URI: The format of the URI could not be determined.. See the inner exception for more details. ---> System.UriFormatException: Invalid URI: The format of the URI could not be determined. [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
MSBUILD : OctoPack error OCT-1676060969:    at System.Uri.CreateThis(String uri, Boolean dontEscape, UriKind uriKind) [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
MSBUILD : OctoPack error OCT-1676060969:    at System.Uri..ctor(String uriString) [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
MSBUILD : OctoPack error OCT-1676060969:    at OctoPack.Tasks.Util.OctopusPhysicalFileSystem.GetPathRelativeTo(String fullPath, String relativeTo) in Z:\buildAgent\workDir\20ba9f2e0d5e4022\source\OctoPack.Tasks\Util\OctopusPhysicalFileSystem.cs:line 211 [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
MSBUILD : OctoPack error OCT-1676060969:    --- End of inner exception stack trace --- [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
MSBUILD : OctoPack error OCT-1676060969:    at OctoPack.Tasks.Util.OctopusPhysicalFileSystem.GetPathRelativeTo(String fullPath, String relativeTo) in Z:\buildAgent\workDir\20ba9f2e0d5e4022\source\OctoPack.Tasks\Util\OctopusPhysicalFileSystem.cs:line 224 [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
MSBUILD : OctoPack error OCT-1676060969:    at OctoPack.Tasks.CreateOctoPackPackage.AddFiles(XContainer nuSpec, IEnumerable`1 sourceFiles, String sourceBaseDirectory, String targetDirectory, String relativeTo) in Z:\buildAgent\workDir\20ba9f2e0d5e4022\source\OctoPack.Tasks\CreateOctoPackPackage.cs:line 443 [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
MSBUILD : OctoPack error OCT-1676060969:    at OctoPack.Tasks.CreateOctoPackPackage.Execute() in Z:\buildAgent\workDir\20ba9f2e0d5e4022\source\OctoPack.Tasks\CreateOctoPackPackage.cs:line 190 [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
Done Building Project "T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj" (default targets) -- FAILED

原因

花了一些時間后,我使用了一個內部開發的組件,該組件正在使用Microsoft.Net.Compilers 內部組件使用Microsoft.Net.Compilers的原因是為了克服這個問題( C#: throw invalid expression compilation )並以這種方式解決( How to use C# 7 with Visual Studio 2015? )。 這導致,當我在主程序上安裝組件時, Microsoft.Net.Compilers會自動添加它。

解決方案

我的解決方法是,從我們的內部組件中卸載(按照@malikKhalil 回答)

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

並在 Jenkins 中選擇 C# 7 編譯器而不是 C# 6 並重新構建,這是為了確保一切正常工作和構建。

最后,在我的主程序中,我嘗試更新我的內部組件。 一切都比重新構建。 它的構建沒有任何問題或問題。

根據上面 Daniel Neel 的評論:

Microsoft.CodeDom.Providers.DotNetCompilerPlatform Nuget 包的 1.0.3 版適用於我,但 1.0.6 版會導致此問題中的錯誤

降級到 1.0.3 為我解決了這個問題。

在我的情況下,我只需要轉到 Visual Studio 解決方案資源管理器(Web 應用程序項目)中的 bin 目錄並直接包含 roslyn 項目。 通過右鍵單擊文件夾並選擇包含在項目中。 並再次簽入解決方案以觸發構建過程。

默認情況下不包括 roslyn 文件夾。

Microsoft.CodeDom.Providers.DotNetCompilerPlatform從 1.0.0 升級到 1.0.1 為我解決了這個問題。

如果您在 MVC 中添加 ASPNETCOMPILER 來編譯 Razor 視圖,就像在這個 StackOverflow question中一樣,然后將 PhysicalPath 更改為 Roslyn nuget 包所在的位置(通常通過$CscToolPath變量指向):

<Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
<AspNetCompiler VirtualPath="temp" PhysicalPath="$(CscToolPath)" />

就我而言,只需刪除 bin 文件夾中的所有內容並重新編譯即可為我完成所有工作。

默認 VS2015 模板的問題在於編譯器實際上並未復制到{outdir}_PublishedWebsites\tfr\bin\roslyn\目錄,而是{outdir}\roslyn\目錄。 這可能與您的本地環境不同,因為AppHarbor使用輸出目錄構建應用程序,而不是“就地”構建解決方案。

要修復它,請在 xml 塊<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">...</Target>之后將以下內容添加到.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>

參考:https: //support.appharbor.com/discussions/problems/78633-cant-build-aspnet-mvc-project-generated-from-vstudio-2015-enterprise

打開項目文件並使用 Import Project="..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0...刪除所有引用。

打開 web.config 並刪除所有 system.codedom 編譯器屬性

在我的例子中,類似於 Basim,有一個 NuGet 包告訴編譯器我們需要 C# 6,而我們不需要。

我們必須刪除 NuGet 包Microsoft.CodeDom.Providers.DotNetCompilerPlatform然后刪除:

  1. <package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.0" targetFramework="net452" />來自 packages.config 文件
  2. <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 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+" /> </compilers> </system.codedom>

system.codedom節點中,您可以看到它為什么引入 roslyn: compilerOptions="/langversion:6

刪除解決方案資源管理器中的 Bin 文件夾並再次構建解決方案。 那將解決問題

當一切在本地主機上完美運行時,我在服務器上安裝我的應用程序時遇到了同樣的問題。

這些解決方案都沒有奏效,我總是遇到同樣的錯誤:

Could not find a part of the path 'C:\inetpub\wwwroot\myApp\bin\roslyn\csc.exe'

我最終這樣做了:

  • 在我的設置項目上,右鍵單擊,查看 > 文件系統
  • 創建一個bin/roslyn文件夾
  • 選擇添加 > 文件並從packages\Microsoft.Net.Compilers.1.3.2\tools添加所有文件

這解決了我的問題。

我有沒有 csproj 文件的 webproject,這里提到的解決方案對我不起作用。

更改目標 .NET 框架,重新安裝包( Update-Package -reinstall )然后構建項目對我有用。 您甚至可以在此操作后更改目標框架(讓您在之后再次重新安裝 nuget 包)。

除了從解決方案中的所有項目中刪除 Bin 目錄外,還要刪除 obj 文件夾。

在主解決方案目錄中刪除文件夾 .vs

在嘗試將已經完成的項目帶入在 git 上創建的空白解決方案中時為我工作。

在執行以下步驟之前,我嘗試了多個最佳答案(ASP.NET 項目針對 .NET Framework 4.6.2,Visual Studio 2019 在具有瘋狂限制組策略的系統上,2021 年 3 月)。

我需要:

  • 管理員身份運行 VS

  • 在包管理器控制台中運行

    Update-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform -v 2.0.1
  • 清潔和重建解決方案

如果不以管理員身份運行 VS,組策略會阻止更新包需要運行的 ps1 腳本。

PS。 在此之前,我嘗試了許多其他答案(並在失敗后運行 git reset --hard )。 我不知道他們中的任何人是否為最終的工作做出了貢獻。 我試過了:

對於那些在構建服務器(TFS 或 Bamboo)上編譯時遇到這個問題的人,我可以通過從“/t:”msbuild 選項中刪除“clean”選項來解決這個問題。

我的解決方案是使用 Nuget 將以下項目更新到最新版本: - Microsoft.Net.Compilers - Microsoft.CodeDom.Providers.DotNetCompilerPlatform 然后重建項目。 由於我的項目是一個網站,所以沒有 *.csproj 文件。 當我嘗試在瀏覽器中查看 cshtml 時出現上述錯誤。

上述兩項更新到最新版本后,該錯誤已修復。 我在VS2015和windows7 SP1

就我而言,當我同時運行兩個 Visual Studio IDE 時遇到了這個問題。 所以解決方案是清理項目並關閉另一個實例。

重新啟動 Windows。

這是嘗試重建、刪除bin的內容並重建、重新啟動 Visual Studio 后唯一對我有用的解決方案。

這是 C#/.NET 構建工具有多糟糕的又一個例子。

我認為(在閱讀了許多答案之后),總體結論是這個問題的原因和解決方案在很大程度上取決於設置和項目,所以如果一個答案不起作用,請嘗試另一個答案。 在弄亂 NuGet 包或重新安裝開發工具之前,首先嘗試非侵入性/破壞性解決方案,例如重新啟動 Visual Studio、重新啟動、重建等。 祝你好運!

(注意:使用 Visual Studio 2019,項目文件最初是在 Visual Studio 2015 中創建的。也許這有助於某人調查問題)

(編輯:這可能是由於安裝/修改 Visual Studio 安裝后未重新啟動或在安裝程序提示重新啟動時更新 Visual Studio 造成的嗎?)

我在部署到的服務器上遇到了這個問題,並確定我不需要

Microsoft.CodeDom.Providers.DotNetCompilerPlatform

所以,我通過 nuget 卸載了它,並刪除了 web 配置中的引用。 沒有更多的問題。

我最初嘗試將目標節點添加到 .proj 文件中,如其他一些答案中所述,但這只會導致另一個錯誤,即msbuild無法復制pagefile.sys ,這似乎是我讀到的錯誤nuget 包。

以下為我解決了這個問題:

  • 更新到最新版本的 Visual Studio 2017(使用安裝程序應用)

  • 清理並重建解決方案

將 PropertyGroup 添加到您的 .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>

我對Microsoft.CodeDom.Providers.DotNetCompilerPlatform 1.06有此錯誤,但對 @PrisonerZERO 工作的1.0.7也有此錯誤。 但是,當 Microsoft 發布1.0.8 2017-10-18 時,它終於再次開始為我工作,我不必降級。

https://www.nuget.org/packages/Microsoft.CodeDom.Providers.DotNetCompilerPlatform/

就我而言,我注意到“packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.0”路徑中不存在“build”文件夾。 這就是沒有創建 roslyn 文件夾的原因。

所以對我來說解決方案是:

  1. 清潔溶液
  2. 轉到 Nuget 包管理器
  3. 卸載 Microsoft.CodeDom.Providers.DotNetCompilerPlatform
  4. 清潔溶液
  5. 從 Nuget 包管理器再次安裝 Microsoft.CodeDom.Providers.DotNetCompilerPlatform。
  6. 清理/重建

你去吧。 上面的解決方案都不適合我。 希望這對任何人都有幫助

為了防止構建也將 Roslyn 文件復制到 bin 目錄,您還必須注釋掉位於 Web 應用程序項目頂部的這一行:

<!--  <Import Project="..\..\..\DAS\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props" Condition="Exists('..\..\..\DAS\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" /> -->

通過 NuGet 更新一些包后,我遇到了這個問題。 重建(而不是正常的構建)對我有用。

更新 DotNetCompilerPlatform 后我遇到了同樣的問題。 通過重新啟動 Visual Studio > Clean Project > Build Project 解決。

供參考...

截至 2017 年 8 月 31 日,升級到 Microsoft.CodeDom.Providers.DotNetCompilerPlatform 1.0.7 是可行的。

這可以通過以下簡單的方式完成 -

  • 在系統的任何位置創建一個類似類型的新項目。 構建它並將 roslyn 文件夾復制到您的 bin 目錄。

很多這些答案是指 Nuget 包和/或清理和重新加載您的項目。

如果您有 WCF 服務引用和無效終結點,您也會收到此錯誤消息。 確保您的端點正確,並在 .config 中使用正確的端點更新服務配置,並在您從 GUI 配置服務引用時更新服務配置。

服務參考配置 GUI 的圖像

我不得不將 WebAPI 和 MVC 項目文件更改為不構建視圖:

<MvcBuildViews>false</MvcBuildViews>

這用 roslyn 解決了我的 TFS 2015 Build server 錯誤。 仍然不確定為什么 csc.exe 被復制到 \bin\csc.exe,但發布過程正在尋找 \bin\Roslyn\csc.exe...找不到導致該差異的轉換。

我在運行 MSBuild 的 Jenkins 構建服務器上遇到此錯誤,該服務器將構建文件輸出到單獨的文件夾位置 (_PublishedWebsites)。 完全一樣 - 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 文件夾中重新創建它們時,您現在有 2 個這些文件的副本正在編譯並且它們之間存在沖突. 經過很多挫折后,我決定進行“黑客”修復 - 一個額外的構建后任務,從 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>

......................更多在這里......................

我在發布管道(生成 _PublishedWebsites 目錄)中遇到了這個問題,並將其用作項目中的目標:

<Target Name="CopyRoslynCompilerFilesToPublishedWebsitesDirectory" AfterTargets="AfterBuild" Condition="Exists('$(OutDir)\_PublishedWebsites\$(TargetName)')">
    <Copy SourceFiles="@(RoslyCompilerFiles)" DestinationFolder="$(OutDir)\_PublishedWebsites\$(TargetName)\bin\roslyn" ContinueOnError="true" SkipUnchangedFiles="true" />
</Target>

缺點是輸出中會有兩個 Roslyn 文件的副本。

在重命名解決方案和一些包含的項目並嘗試刪除 nuget 包后,我遇到了這個錯誤。 我將新項目與上一個工作項目進行了比較,發現缺少以下幾行,需要重新添加:

  <Import Project="..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props" Condition="Exists('..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" />
  <Import Project="..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props" Condition="Exists('..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props')" />
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />

這樣做為我解決了這個問題。

在我的情況下,我們的團隊不想保留“packages”文件夾,因此我們將所有 dll 放在其他目錄中,例如“sharedlib”。

我使用構建事件來解決這個問題。

if "$(ConfigurationName)" == "Release" (
goto :release
) else (
goto:exit
)

:release
if not exist $(TargetDir)\roslyn mkdir $(TargetDir)\roslyn

copy /Y "$(ProjectDir)..\..\Shared Lib\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.1\tools\Roslyn45\*" "$(TargetDir)\roslyn"
goto :exit

:exit

其他答案都不適合我。 在與我預期的提交文件之前/之后進行文件夾比較后,我發現 GIT 忽略了所需的文件夾。 如果您在存儲庫中跟蹤編譯器,請確保跟蹤 BUILD 文件夾。 如果不是,編譯器將永遠不會被構建,並且會在發布后拋出這個確切的錯誤。 我將此行添加到我的.gitignore文件中:

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

現在它正在正確部署到其他計算機。

我有一個在 VS2019 中運行的項目,然后我第一次打開(在 VS2019 中)另一個項目,我遇到了上述問題。 我做了如下操作:

  1. 我關閉正在運行的項目,
  2. 清理並重建新項目

只點號 2 對我不起作用。

問題

請注意,NuGet PM 會破壞 Rosalyn 行為。 單擊Tools > NuGet Package Manager > Manage NuGet Packages for Solution的 NuGet 包 如果Microsoft.CodeDom.Providers.DotNetCompilerPlatformMicrosoft.Net.CompilersMicrosoft.Net.Compilers.netcore存在更新,請更新它們,解決方案將中斷! 這是因為 ASP 站點模板設置為在項目創建時使用特定版本。 要查看問題,請單擊解決方案資源管理器中的顯示所有文件。

使固定

在項目創建時$(WebProjectOutputDir)\bin不存在,因此當 NuGet 將 Rosalyn 添加為依賴項時,它會正確安裝它。 更新解決方案包后, $(WebProjectOutputDir)\bin目錄如下所示:

$(WebProjectOutputDir)\bin\bin\rosalyn

最簡單的解決方法是將 rosalyn 剪切並粘貼到正確的位置,然后刪除多余的bin文件夾。 您現在可以刷新頁面,網站將加載。

對於網站項目和 Web 應用程序項目,答案是不同的。 根本問題是 NuGet 包在不同機器上的行為不同。 可能是權限問題或某些執行策略阻止它復制到 Bin 文件夾 如您所知 Roslyn 是新編譯器。 您應該將它放在這些項目的 Bin 文件夾中轉到您的網站 NuGet Packages 檢查此文件夾 Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.0 \code\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.0 你看到了嗎? 您能在其中看到 code\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.0\tools\RoslynLatest 現在作為編譯此文件夾的一部分,應該像這樣將這個文件夾復制到您的網站下。 \code\WebSite1\Bin\Roslyn 一些你沒有發生的事情。 嘗試以 Admin 身份運行 Visual Studio。 手動復制 Roslyn 文件夾。 嘗試卸載並安裝 NuGet 包。 記住這個包編譯你的文件夾,如果它不在那里你不能編譯任何東西,所以你也不能添加任何東西。 嘗試將此包復制到離線版本工具 -> 選項-> nuget 包管理器-> 包源-> Microsoft Visual Studio Offline Packages C:\Program Files (x86)\Microsoft SDKs\NuGetPackages

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

通過在 nuget 控制台中運行以下命令,我也面臨同樣的問題得到解決

安裝包 Microsoft.Net.Compilers -Version 3.3.1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM