解決無效命令列選項與建置設定的錯誤與警告

本文涵蓋下列編譯器錯誤和警告:

  • CS0006找不到元資料檔案「檔案」
  • CS0007意外的共通語言執行時初始化錯誤 — 「描述」
  • CS0016無法寫入輸出檔案「file」——「原因」
  • CS1564指定了衝突選項:Win32 資源檔;Win32 清單
  • CS1616選項「option」覆蓋原始碼檔案或新增模組中給出的屬性「attribute」
  • CS1668:在 「option」中指定無效的搜尋路徑「path」——「reason」
  • CS1719開啟 Win32 資源檔案 'file' 時發生錯誤 -- 'reason'
  • CS1773/subsystemversion 的版本無效。若為 ARM 或 AppContainerExe,版本必須為 6.02 或以上;否則必須為 4.00 或以上
  • CS2008未指定原始碼檔案。
  • CS2019:/ target 的無效目標類型:必須指定「exe」、「winexe」、「library」或「module」
  • CS2029預處理符號名稱無效;「識別碼」不是一個有效的識別碼
  • CS2032在命令列或回應檔案中不允許使用字元 'character'
  • CS2036/pdb 選項也必須同時使用 /debug 選項
  • CS2038語言名稱「name」無效。
  • CS2039命令列語法錯誤:選項「option」的 Guid 格式「value」無效
  • CS2040命令列語法錯誤:缺少選項「option」的指引
  • CS2041輸出名稱:名稱無效
  • CS2042偵錯資訊格式無效:format
  • CS2043不再支援「id#」語法。改用「$id」代替。
  • CS2044/sourcelink 交換器僅在發出 PDB 時支援。
  • CS2045/embed 交換器僅在發出 PDB 時支援。
  • CS2046命令列語法錯誤:「value」並非「option」選項的有效值。該值必須以「格式」的形式存在。
  • CS3012您必須在組件上指定 CLSCompliant 屬性,而非模組,才能啟用 CLS 合規性檢查
  • CS3013新增模組必須以 CLSCompliant 屬性標記以匹配組裝
  • CS7038未能發射模組「module」:錯誤
  • CS8751C# 編譯器內部錯誤。
  • CS8771無法確定輸出目錄
  • CS8772指定了 stdin 參數 '-',但輸入尚未從標準輸入串流重新導向。

輸入與輸出檔案錯誤

  • CS0006找不到元資料檔案「檔案」
  • CS0016無法寫入輸出檔案「file」——「原因」
  • CS1668:在 「option」中指定無效的搜尋路徑「path」——「reason」
  • CS1719開啟 Win32 資源檔案 'file' 時發生錯誤 -- 'reason'
  • CS2008未指定原始碼檔案。

這些錯誤表示編譯器無法找到、讀取或寫入編譯所需的檔案。 關於完整檔案相關編譯器的選項清單,請參見 C# 編譯器選項 - 輸入C# 編譯器選項 - 資源

  • 確認傳遞給 參考 或相關選項的路徑指向現有的組件(CS0006)。 此錯誤通常發生在專案檔案或命令列中的組合語言引用指定了不存在的路徑時。 檢查錯字,確保參考專案已建置,並確認檔案沒有被移動或刪除。
  • 檢查輸出路徑是否存在且可寫,並確保目前沒有任何程序鎖定該檔案(CS0016)。 例如,嘗試建置時確保執行檔沒有在執行。 如果之前建立的檔案已經位於該位置,請確認其不是唯讀狀態。
  • 確認你提供給 AdditionalLibPaths 或 LIB 環境變數的路徑是否存在且可存取(CS1668)。 單引號的錯誤訊息包含作業系統錯誤,解釋為何路徑無效。
  • 請修正 Win32 資源檔案(CS1719)錯誤原因中描述的問題。 最常見的原因包括「找不到檔案」(驗證路徑)或「存取被拒」(檢查檔案權限)。
  • 至少將一個原始碼檔案傳給編譯器(CS2008)。 這個錯誤發生在你指定編譯器選項但沒有提供任何 .cs 檔案作為輸入時。

無效的選項值

  • CS1773/subsystemversion 的版本無效。若為 ARM 或 AppContainerExe,版本必須是 6.02 或以上;否則必須是 4.00 或以上
  • CS2019:/ target 的無效目標類型:必須指定「exe」、「winexe」、「library」或「module」
  • CS2029預處理符號名稱無效;「識別碼」不是一個有效的識別碼
  • CS2032命令列或回應檔案中不允許使用字元 'character'
  • CS2038語言名稱「name」無效。
  • CS2039命令列語法錯誤:選項「option」的 Guid 格式「value」無效
  • CS2040命令列語法錯誤:缺少選項「option」的指引
  • CS2041輸出名稱:名稱無效
  • CS2042除錯資訊格式:格式無效
  • CS2043不再支援「id#」語法。改用「$id」來代替。
  • CS2046命令列語法錯誤:「value」並非「option」選項的有效值。該值必須以「格式」的形式存在。
  • CS8772指定了 stdin 參數 '-',但輸入尚未從標準輸入串流重新導向。

這些錯誤表示傳遞給編譯器選項的值格式錯誤或超出允許的值集。 完整的編譯器選項列表,請參見 C# 編譯器選項

  • 提供 SubsystemVersion 選項(CS1773)的有效版本號。 ARM 與 AppContainerExe 目標需要版本 6.02 或更高版本;其他目標則需4.00或以上。
  • 請使用有效的 OutputType 值之一:exe、、winexelibrary、或moduleCS2019)。 / target 選項的其他值則被拒絕。
  • 確保傳給 DefineConstants 的預處理符號為有效的 C# 識別碼(CS2029)。 識別碼必須以字母或底線開頭,且僅包含字母、數字或底線。 這個警告無法被 NoWarn 選項壓制。
  • 移除命令列參數與|中的 ASCII 控制字元(範圍 0–31)及管道()字元(CS2032)。 命令列處理器與 IDE 通常會過濾這些字元,因此此錯誤最常出現在包含無效字元的回應檔案時。 此錯誤不再由新版本編譯器產生。
  • 提供編譯器認可的有效文化名稱(CS2038)。 請核對支持的文化名稱清單上的拼寫。
  • 對於需要 GUID 的選項,例如/ checksumalgorithmCS2039CS2040),提供格式正確的 GUID。 GUID 必須遵循標準格式(例如 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)。
  • 移除輸出檔名中的無效字元(CS2041)。 輸出名稱不能包含目標作業系統檔案路徑中無效的字元。
  • 提供有效的除錯資訊格式值(CS2042)。 接受的值依編譯器版本而異,通常包含 fullpdbonlyportableembedded
  • 將舊 id# 有語法替換為 $idCS2043)。 舊的語法已不再被編譯器支援。
  • 提供與指定選項預期格式相符的值(CS2046)。 錯誤訊息指出預期的格式。
  • 使用 - (stdin)參數(CS8772)時,重定向標準輸入。 編譯器在你傳遞 - 原始檔案參數時會預期輸入是管道輸入。 使用管線(例如 cat file.cs | csc -),或移除 - 參數並直接傳遞原始檔案。

矛盾或缺少選項

  • CS1564指定了衝突選項:Win32 資源檔;Win32 清單
  • CS1616選項「option」覆蓋原始碼檔案或新增模組中給出的屬性「attribute」
  • CS2036/pdb 選項也必須同時使用 /debug 選項
  • CS2044/sourcelink 交換器僅在發出 PDB 時支援。
  • CS2045僅在產生 PDB 時才支援 /embed 選項。
  • CS8771無法確定輸出目錄

這些錯誤表示編譯器選項彼此矛盾、覆蓋原始碼層級屬性,或需要你未指定的伴隨選項。 完整的編譯器選項列表,請參見 C# 編譯器選項

  • 請將自訂的 Win32 清單包含在 Win32 資源檔中,並移除 /win32manifest 編譯器選項(CS1564)。 你無法同時指定 Win32ResourceWin32Manifest 。 如果你使用 /Win32res,請將清單包含在資源檔案中。
  • 移除衝突的來源屬性或衝突的命令列選項,避免它們互相矛盾(CS1616)。 當原始程式碼中像 AssemblyKeyFileAttributeAssemblyKeyNameAttribute 這類組件屬性與 KeyFileKeyContainer 命令列選項發生衝突時,就會出現此警告。
  • 使用 PdbFile 時可新增 /debug 編譯器選項,或移除 /pdb 選項(CS2036)。 程式資料庫檔案僅用於除錯編譯,因此沒有 /debug/pdb 毫無意義。 欲了解更多資訊,請參閱 DebugType(C# 編譯器選項)。
  • 在使用 /sourcelinkDebugTypeCS2044CS2045)時,新增 /debug 選項(或專案中的設定)以啟用 PDB 產生。 來源連結與嵌入式原始碼都需要 PDB 輸出,因為原始碼資訊儲存在 PDB 檔案中。
  • 請確保專案或命令列指定有效的輸出目錄(CS8771)。 驗證 OutputPath 專案檔案中的 OR OutDir 屬性,或向編譯器傳遞有效的 /out: 參數。

模組與組裝配置

  • CS3012您必須在組件上指定 CLSCompliant 屬性,而非模組,才能啟用 CLS 合規性檢查
  • CS3013新增模組必須以 CLSCompliant 屬性標記以匹配組裝

這些警告涉及模組與組件上的 CLSCompliant 屬性之間的不一致。 欲了解更多 CLS 相關資訊,請參閱 語言獨立性與語言獨立元件

  • 在指定 時,請使用 OutputType 編譯器選項的 [module:System.CLSCompliant(true)] 元素進行建置(CS3012)。 模組上的 CLSCompliant 屬性僅在輸出目標為模組而非組裝時才有意義。
  • 為透過 [module:CLSCompliant(true)] 新增的模組加入對應的 [module:CLSCompliant(false)] 屬性,使其與組件的 CLS 狀態一致(CS3013)。 預設為 [module:CLSCompliant(false)],因此應該符合 CLS 標準的模組必須明確選擇加入。

編譯器基礎設施錯誤

  • CS0007意外的共通語言執行時初始化錯誤 — 「描述」
  • CS7038未能發射模組「module」:錯誤
  • CS8751C# 編譯器內部錯誤。

這些錯誤顯示編譯器自身基礎設施的故障,而非原始碼或命令列選項的問題。

  • 確認 csc.exe.config 中指定的執行時版本已安裝且未損壞(CS0007)。 設定過程會設定這個檔案,你不應該更改它。 如果你修改了檔案,請檢查機器上是否存在指定的執行版本。 如果正確版本存在但可能損壞,請重新安裝通用語言執行時。 新版本的編譯器不再產生此錯誤,且不適用於現代 dotnet build 工具鏈。
  • 試著乾淨重建,確認所有組合文參考都有效且無損壞,並檢查是否有衝突的參考版本(CS7038)。 此錯誤會包裹組裝發射階段的低階故障。 巢狀錯誤訊息會提供更具體的錯誤細節。
  • 在 Roslyn 存放庫中回報問題,並附上最小重現範例(CS8751)。 此錯誤表示編譯器本身存在錯誤。 你的程式碼暴露了編譯團隊未預料到的程式碼路徑。