解決編譯器選項與建置設定的錯誤與警告

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

  • 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」:錯誤
  • CS8111: 無效的儀器類型:儀器類型
  • CS8113: 無效雜湊演算法名稱:「雜湊演算法名稱」
  • CS8190: 提供的原始程式碼種類不受支援或無效: 'source code kind'
  • CS8191:提供的文件模式不受支援或無效:'文件模式'。
  • CS8202: netmodule 不支援公開簽約。
  • CS8308:使用 refonly 時,請勿使用 refout。
  • CS8309: 使用 /refout 或 /refonly 時無法編譯網路模組。
  • CS8357: 指定的版本字串「version string」包含萬用字元,且與確定性不相容。要麼移除版本字串中的萬用字元,要麼在此編譯中關閉確定性
  • CS8751: C# 編譯器內部錯誤。
  • CS8771: 無法確定輸出目錄
  • CS8772: 指定了 stdin 參數 '-',但輸入尚未從標準輸入串流重新導向。
  • CS9400: 無效的「option」值:「value」。接受的值有:'value1, value2, ...'

輸入與輸出檔案錯誤

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

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

  • 確認你傳遞給 References 或相關選項的路徑指向現有的組件(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 參數 '-',但輸入尚未從標準輸入串流重新導向。
  • CS9400: 無效的「option」值:「value」。接受的值有:'value1, value2, ...'

這些錯誤表示你傳給編譯器選項的值出現了異常或超出允許的值集。 完整的編譯器選項列表,請參見 C# 編譯器選項。

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

儀器與PDB選項

  • CS8111: 無效的儀器類型:儀器類型
  • CS8113:無效的雜湊演算法名稱:'雜湊演算法名稱'

通過 /instrument 選項後,請使用支援的儀表類型。 命令列選項接受TestCoverage;Roslyn API 使用者必須在 (CS8111) 中提供有效InstrumentationKind值EmitOptions.InstrumentationKinds。

提供由目前平台支援的密碼學雜湊演算法,內容為 EmitOptions.PdbChecksumAlgorithm (CS8113)。 確定性輸出也需要非空的 PDB 檢查碼演算法。 此 API 設定計算已編譯檔案中儲存的 PDB 校驗和。 這與編譯器選項 ChecksumAlgorithm 不同,後者會選擇 SHA1 或 SHA256,作為儲存在 PDB 中的原始程式檔總和檢查碼。 無效的命令列參數值會在解析命令列時遭到拒絕,而不是回報成 CS8113 錯誤。

解析與文件 API 選項

  • CS8190:提供的原始程式碼種類不受支援或無效: 'source code kind'
  • CS8191:所提供的文件模式不受支援或無效:'documentation mode'。

一般 csc 的命令列選項解析不會產生這些公開的 Roslyn API 診斷。 當 CSharpParseOptions 執行個體包含無效的列舉值時,CSharpParseOptions.Errors 會將其顯示出來。 CSharpCompilation.GetDiagnostics() 同時,在包含使用這些選項的語法樹被納入編譯後,也要回報這些選項,但 CSharpSyntaxTree.GetDiagnostics() 不會回報。

矛盾或缺少選項

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

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

  • 請將自訂的 Win32 清單包含在 Win32 資源檔中,並移除 /win32manifest 編譯器選項(CS1564)。 你無法同時指定 Win32Resource 和 Win32Manifest 。 如果你使用 /Win32res,請將清單包含在資源檔案中。
  • 移除衝突的來源屬性或衝突的命令列選項,避免它們互相矛盾(CS1616)。 當原始程式碼中像 AssemblyKeyFileAttribute 或 AssemblyKeyNameAttribute 這類組件屬性與 KeyFile 或 KeyContainer 命令列選項發生衝突時,就會出現此警告。
  • 使用 PdbFile 時可新增 /debug 編譯器選項,或移除 /pdb 選項(CS2036)。 程式資料庫檔案僅用於除錯編譯,因此沒有 /debug 的 /pdb 毫無意義。 欲了解更多資訊,請參閱 DebugType(C# 編譯器選項)。
  • 在使用 /sourcelink 或 DebugType(CS2044、CS2045)時,新增 /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 標準的模組必須明確選擇加入。

公開簽名與參考組件輸出

  • CS8202: netmodule 不支援公開簽約。
  • CS8308:使用 refonly 時,請勿使用 refout。
  • CS8309: 使用 /refout 或 /refonly 時無法編譯網路模組。

netmodule 包含元資料與編譯程式碼,但沒有組合語言清單。 因為公開簽名會將公鑰和簽署標誌套用到組合清單上,所以不要將 PublicSign 與 moduleOutputType (CS8202)合併。 產生一個組件,或是停用 netmodule 的公開簽章。

此 /refout 選項除了實作組件外,還會產生參考組件。 此 /refonly 選項僅產生一個參考組件作為主要輸出。 使用/refonly時請移除/refout(CS8308)。 參考組件需要組件清單,所以不要把任一選項和 /target:module (CS8309) 合併。 對於 MSBuild 專案,請使用 ProduceReferenceAssembly 或 ProduceOnlyReferenceAssembly,但不要同時使用兩個。

確定性組合版本

  • CS8357: 指定的版本字串「version string」包含萬用字元,這些通配符與確定性不相容。要麼移除版本字串中的萬用字元,要麼關閉本編譯的確定性。

確定性編譯需要相同的輸入才能產生相同的輸出。 AssemblyVersionAttribute 中的萬用字元會從變動的值推導出部分版本資訊,因此與 確定性 編譯不相容。 用固定的數值元件取代萬用符。 只有在需要產生萬用字元版本時,才關閉確定性編譯。

編譯器基礎設施錯誤

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

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

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