![](/img/trans.png)
[英]How does the Roslyn C# compiler know where to find .NET assembly files?
[英]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
假設一個相當新的 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 編譯實例來實現相同的目的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.