控制程式代碼產生的 c # 編譯器選項

下列選項會控制編譯器的程式碼產生。 新的 MSBuild 語法會以粗體顯示。 舊版的 csc.exe 語法如下所示

  • DebugType-debug :發出 (或不發出) 的調試資訊。
  • Optimize-optimize :啟用優化。
  • 決定性-deterministic :從相同的輸入來源產生位元組的相等輸出。
  • ProduceOnlyReferenceAssembly-refonly :產生參考元件,而不是完整元件,做為主要輸出。

DebugType

DebugType選項會讓編譯器產生調試資訊,並將其放在輸出檔案中。 預設會針對 Debug 組建設定加入偵錯工具資訊。 發行組建設定預設為關閉。

<DebugType>pdbonly</DebugType>

對於從 c # 6.0 開始的所有編譯器版本, pdbonlyfull之間沒有任何差異。 選擇 [ pdbonly]。 若要變更 .pdb 檔案的位置,請參閱 PdbFile

下列是有效值:

意義
full 使用目前平臺的預設格式,將偵錯工具的資訊發出至 .pdb 檔案:
Windows: Windows pdb 檔案。
Linux/macOS便攜 PDB 檔案。
pdbonly full 相同。 如需詳細資訊,請參閱下面的附注。
portable 使用跨平臺 可移植 pdb 格式,將調試資訊發出至 .pdb 檔。
embedded 將偵錯工具發出至 .dll/.exe 本身 (.pdb 檔案不會使用 可移植 pdb 格式產生) 。

重要

下列資訊僅適用于 c # 6.0 之前的編譯器。 這個元素的值可以是 fullpdbonly完整的引數,如果您未指定pdbonly,它就會生效,可將偵錯工具附加至執行中的程式。 指定 pdbonly 可在偵錯工具中啟動程式時,允許原始程式碼的偵錯工具,但只有在將執行中的程式附加至偵錯工具時,才會顯示組合器。 若要建立偵錯組建,請使用此選項。 如果您使用full,請注意,對 JIT 優化程式碼的速度和大小有一些影響,且對程式碼品質的影響很小。 我們建議 pdbonly 或沒有 PDB 來產生發行程式碼。 Pdbonlyfull之間的一項差異是,編譯器會發出 ,用來告知 JIT 編譯程式有可用的偵錯工具資訊。 因此,如果您的程式碼包含設定為 false 的 DebuggableAttribute ,則會收到錯誤(如果您使用 DebuggableAttribute)。 如需如何設定應用程式偵錯效能的詳細資訊,請參閱使映像偵錯更容易

最佳化

Optimize選項可啟用或停用由編譯器執行的優化,讓您的輸出檔案變得更小、更快且更有效率。 針對發行組建設定,預設會啟用優化選項。 它預設為關閉 Debug 組建設定。

<Optimize>true</Optimize>

您可以在 Visual Studio 中,從專案的 [組建屬性] 頁面設定 [優化] 選項。

Optimize 也會告知 common language runtime 在執行時間將程式碼優化。 根據預設,會停用最佳化。 指定 Optimize + 以啟用優化。 建立元件要使用的模組時,請使用與元件所使用的相同 優化 設定。 您可以結合 優化調試 程式選項。

具決定性

可讓編譯器產生相同輸入之編譯間的逐一位元組輸出相同的組件。

<Deterministic>true</Deterministic>

根據預設,指定輸入集合中的編譯器輸出是唯一的,因為編譯器會新增從亂數字產生的時間戳記和 MVID。 您可以使用 <Deterministic> 選項來產生「確定性組件」<Deterministic>,這是只要輸入維持不變,其二進位內容在編譯之間就相同的組件。 在這種組建中,時間戳記和 MVID 欄位將會取代為從所有編譯輸入的雜湊衍生的值。 編譯器會考慮下列會影響確定性的輸入:

  • 命令列參數序列。
  • 編譯器之 .rsp 回應檔的內容。
  • 使用的編譯器精確版本和其參考的組件。
  • 目前的目錄路徑。
  • 以直接或間接方式明確地傳遞給編譯器之所有檔案的二進位內容,包含:
    • 原始程式檔
    • 參考的組件
    • 參考的模組
    • 資源
    • 強式名稱金鑰檔
    • @ 回應檔
    • 分析器
    • 規則集
    • 分析器可能使用的其他檔案
  • 目前文化特性 (Culture) (適用於用來產生診斷和例外狀況訊息的語言)。
  • 如果未指定編碼方式,預設的編碼 (或目前的字碼頁) 。
  • 存在、不存在,以及編譯器搜尋路徑 (例如,透過 -lib-recurse 指定) 上檔案的內容。
  • 執行編譯器的 Common Language Runtime (CLR) 平臺。
  • %LIBPATH% 的值,可能會影響分析器相依性載入。

決定性編譯可以用來建立二進位檔是否從受信任的來源進行編譯。 當來源可公開使用時,具決定性的輸出會很有用。 它也可以判斷是否相依于組建程式中所使用之二進位檔變更的組建步驟。

ProduceOnlyReferenceAssembly

ProduceOnlyReferenceAssembly選項表示參考元件應該是輸出,而不是實元件,做為主要輸出。 因為無法執行參考元件,所以 ProduceOnlyReferenceAssembly 參數會以無訊息模式停用輸出 pdb。

<ProduceOnlyReferenceAssembly>true</ProduceOnlyReferenceAssembly>

參考元件是一種特殊類型的元件。 參考元件僅包含代表程式庫公用 API 介面所需的最少量中繼資料。 它們包括在組建工具中參考元件時,所有重要成員的宣告,但排除對其 API 合約沒有任何影響的私用成員的所有成員執行和宣告。 如需詳細資訊,請參閱 參考元件

ProduceOnlyReferenceAssemblyProduceReferenceAssembly選項都是互斥的。