排除 MSBuild 錯誤

2020/12/1 |

症狀

使用 Lucent Sky AVM 掃描 .NET 應用程式時,掃描失敗且出現以下其中一個錯誤:

MSBuild failed. ASP.NET compilation was skipped. (-42110062)

MSBuild failed. ASP.NET compilation failed. (-42110063)

此外,掃描也可能完成但出現以下其中一個警告:

MSBuild failed. (41110021)

MSBuild failed. Some ASP.NET files were skipped during ASP.NET compilation. (41110062)

原因

掃描 .NET 應用程式時,MSBuild 會用來組建應用程式。若 MSBuild 過程中出現錯誤,則掃描就會失敗或僅部分完成。

解決方式

依照以下的方法解決這個問題,自第一個方法開始。若無法解決,請嘗試下一個方法。

方法 1

解決 MSBuild 記錄檔中的錯誤,再重新掃描應用程式。

  • MSBuild 記錄檔包含以下錯誤訊息:

      Could not load file or assembly 'Microsoft.Build'
            
      Could not load type '...' from assembly 'Microsoft.Build.Framework'
    

    此應用程式所要求的 MSBuild 不可用。如果此應用程式使用 .NET Framework 附帶以外的 Microsoft Build Tools,在執行 CLEAR Engine 的伺服器上安裝所需或是最新版本的 Microsoft Build Tools,例如 Visual Studio Build Tooks 2019,並在掃描參數中加入 MsBuild,latest

  • MSBuild 記錄檔包含以下錯誤訊息:

      error MSB4019: The imported project "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.
    

    此應用程式是使用 Visual Studio 2012 或更早的版本開發的。在執行 CLEAR Engine 的伺服器上安裝用來開發此應用程式的 Visual Studio。

  • MSBuild 記錄檔包含以下錯誤訊息:

      error MSB4041: The default XML namespace of the project must be the MSBuild XML namespace.
    

    此應用程式的目標框架為 .NET Core 或 .NET 5.0,或是需要一個獨立的 Microsoft Build Tools,例如 Visual Studio Build Tools 2019。如果此應用程式的目標框架為 .NET Core 或 .NET 5.0,在執行 CLEAR Engine 的伺服器上安裝所需或是最新版本的 Microsoft Build Tools,例如 Visual Studio Build Tools 2019,並在掃描參數中加入 MsBuild,latest

  • MSBuild 記錄檔包含以下錯誤訊息:

      error CS0006: Metadata file 'C:\Windows\system32\config\systemprofile\.nuget\packages\...' could not be found.
    

    此應用程式使用 NuGet,且程式碼壓縮檔案不包含所需要的套件。確認執行 CLEAR Engine 的伺服器能夠存取 NuGet feeds。

    此外,NuGet 的一個 issue 也可能使 MSBuild 無法下載套件。要深入了解如何透過設定套件目錄來避免這個問題,請參考 Lucent Sky 知識庫:
    CLEAR Engine 和 Web UI 管理者指南 § 設定套件目錄

    亦可將位於 C:\Windows\SysWOW64\config\systemprofile\.nuget\packages 的套件複製到 C:\Windows\System32\config\systemprofile\.nuget\packages

  • MSBuild 記錄檔包含以下錯誤訊息:

      error CS1002: ; expected.
            
      error CS1010: Newline in constant.
    
      error CS1525: Invalid expression term '}'
    

    程式碼中可能包含語法或語意錯誤,也可能是程式碼檔案使用了和作業系統不相同的非 Unicode 編碼。要深入了解如何除排編碼問題,請參考 Lucent Sky 知識庫:
    排除編碼問題

    • MSBuild 記錄檔顯示一個屬性,例如 SolutionDir,是空的或未定義

      此專案可能預期組建流程會設定某些組建內容的值。要手動設定組建屬性,使用掃描參數 BuildProperties。每個屬性應使用逗號而非分號分開。例如 BuildProperties,SolutionDir=..\..\Solutions,SkipPostBuildTask=1

要深入了解常見 MSBuild 錯誤類型的資訊,請參考更多資訊段落。

方法 2

使用直接二進位分析來掃描 .NET 應用程式,可以不需要在 Lucent Sky AVM 中組建它們。要深入了解如何使用直接二進位分析,請參考 Lucent Sky 知識庫:
使用直接二進位分析掃描應用程式

方法 3

要關閉 .NET 應用程式的二進位分析而僅使用程式碼分析,在掃描參數中加入 AnalysisEngines,20

更多資訊

常見的 MSBuild 錯類型包含:

  • 無法找到一個組件 - MSBuild 無法找到錯誤訊息中列出的命名空間或類別的組件。這類型的錯誤通常可透過將所需要的 .dll 放置於專案的 bin 目錄,或是在執行 CLEAR Engine 的伺服器上安裝所需要的執行環境。
  • 無法找到一個 .targets 檔案 - MSBuild 無法找到錯誤訊息中列出的 .targets 檔案。這類型的錯誤通常可以透過在執行 CLEAR Engine 的伺服器上安裝所需的組建工具或 SDK。此外,也可以在開發環境中找出所需要的 .targets 檔案,再複製到執行 CLEAR Engine 的伺服器上相同的目錄中。
  • 一個外部工作失敗了 - 有些專案檔案或 .targets 檔案包含了外部工作(例如執行一個執行檔)。如果這樣的工作無法被 MSBuild 執行,錯誤就可能發生。大多數的外部工作可透過將其從專案檔案或 .targets 檔案中移除來安全的略過。
  • 語法或語意錯誤 - .NET 應用程式中語法或語意錯誤有兩個常見的原因,除了程式碼中有實際的語法或語意錯誤以外,也可能是因為使用不正確的編碼來編譯程式碼。要深入了解如何除排編碼問題,請參考 Lucent Sky 知識庫:
    排除編碼問題

若 MSBuild 因為編譯錯誤失敗(例如 CS1234BC1234,而不是 MSB1234),請參考以下資訊:

  • 要深入了解 C# 編譯錯誤和解決方法的更多資訊,請參考 Microsoft Learn 網站:
    C# 編譯器錯誤
  • 要深入了解 Visual Basic 編譯錯誤和解決方法的更多資訊,請參考 Microsoft Learn 網站:
    Visual Basic 中的錯誤訊息