簡體   English   中英

如何告訴 Roslyn C# 編譯器使用特定版本的 .NET?

[英]How do I tell the Roslyn C# compiler to use a specific version of .NET?

我發現 Roslyn 附帶的csc.exe二進制文件可以使用-langversion:<string>命令行參數來設置我想編譯的 C# 的版本。 但是如何選擇我希望編譯器使用的 .NET 版本?

編譯過程適用於我的簡單測試程序,它使用一些 .NET SQL 服務器功能,所以我知道編譯器在我的計算機上以某種方式使用 .NET 版本。 我的C:\Windows\Microsoft.NET\Framework目錄中有多個版本的 .NET,我假設編譯器正在使用其中之一。 我想明確設置編譯器在編譯我的程序時使用的 .NET 版本。

注意:如果您能詳細說明編譯器如何首先選擇一個版本,那也將不勝感激。

我只是從命令行使用它(即下面的2.0)

msbuild <project-or-solution> /p:TargetFrameworkVersion=v2.0

我認為這是在Target Framework的項目屬性中處理的。

在解決方案資源管理器中右鍵單擊項目,select 屬性,選擇application選項卡。

在此處輸入圖像描述

假設一個相當新的 csc 版本,

csc -langversion:?

將告訴您默認情況下csc構建使用的語言版本1

從對另一個答案的評論:

必須有辦法直接告訴 csc.exe 我要使用哪個 .NET 版本

有,並且您已經在問題的第一行中確定了它 - 傳遞-langversion參數。


如果您想知道應該使用哪個版本,請使用默認版本。 如果它沒有抱怨語法錯誤,它可能已經足夠好了。 如果您使用特定的語言功能,您可以嘗試“C# xx 中的新增功能”文檔來確定它是在哪個版本中引入的。


1如果它給你一個錯誤,它不支持它。 運行csc /? 相反, -langversion的文檔應該列出支持的版本。 默認值為列出的最后一個版本號。

簡短的回答是你的關系是錯誤的: csc.exe依賴於 Roslyn,反之亦然。

長答案需要簡短的歷史課:

最初在 .NET 框架中, csc.exe是一個獨立的二進制文件,負責將 C# 源代碼編譯為 IL。 但它是不透明的,它的命令行界面限制了通過調用它可以實現的目標。

Microsoft 引入了System.CodeDom命名空間和類,作為他們自己的工具生成代碼的一種方式(例如,Windows Forms 設計器在 Visual Studio 中),但幾乎每個人都開始使用它,因為它比csc.exe好幾英里。 然而,考慮到它的創建目的,CodeDOM 受到許多限制和邊緣情況的影響,這使得它對於某些非編譯任務來說並不理想——最終它只是調用csc.exe來生成編譯代碼。

最終,這種方法無法滿足微軟自己對其旗艦 IDE 中的代碼進行更好的 static 分析的需要。 為了實現這一要求,需要一個新的 API,微軟意識到,如果他們將其設計為普通開發人員可以訪問,他們可以用一塊石頭殺死兩只鳥。 於是,Roslyn 項目誕生了:一整套獨立完整的 API,任何人都可以使用,從而滿足開發者和 Visual Studio 的需求。

最終的結果是,原本存在於csc.exe中的所有邏輯都遷移到了 Roslyn 的 API 中,而這些 API 的調用方式決定了將使用哪個 C# 語言版本。 -langversion傳遞給csc.exe或將/p:TargetFrameworkVersion傳遞給msbuild.exe最終會設置 Roslyn 語言版本進行編譯,但沒有什么能阻止您創建自己的 Roslyn 編譯實例來實現相同的目的。

參考: https://stackoverflow.com/a/7854697/70345

暫無
暫無

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

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