csc.exe是C#的命令行編譯器(CSharpCompiler),能夠編譯C#源程序成可執行程序。它與Visual Studio等IDE(Integrated Development Environment,集成開發環境)的區別是,csc.exe只是將用C#語言編寫的源程序文件編譯成.exe、.dll等文件,它只是一個編譯器,而IDE提供豐富的調試、運行功能,提供不少view視圖以及解決方案管理器等文件組織功能。html
csc.exe包含在.NET Framework SDK(Software Development Kit)中,除了csc.exe外,SDK還包括其餘語言的編譯器,如vbc.exe(vb語言的編譯器)以及其餘一些可能會用到的工具、文檔等。.NET Framework SDK在微軟官網能夠下載,但如今好像包含在了.NET Framework Developer Pack(開發者包)裏。https://www.microsoft.com/net/download。在這裏能夠下載.NET Framework和.NET Core的最新版本及以前的版本。工具
若是不想那麼麻煩,能夠直接安裝Visual Studio,.NET Framework SDK(或Developer Pack)是自動隨着IDE的安裝而安裝的。能夠在這裏下載免費的Visual Studio 2017社區版:https://visualstudio.microsoft.com/zh-hans/downloads/,也能夠在這個頁面下方選擇安裝以前的舊版本。學習
安裝好SDK後,在磁盤中會多出不少.NET開發工具,其中一些工具須要在命令提示符中打開(Command,CMD)。但這些工具分散在各個文件夾下,須要爲它們配置PATH環境變量,這樣很麻煩。在安裝好Visual Studio後,磁盤中會多出一個相似於CMD的命令提示符,叫做Developer Command Prompt for VS + VS的版本號。Developer Command Prompt預先配置了每個.NET開發工具,不須要爲它們註冊PATH路徑,就能夠在這裏直接使用了。開發工具
好比這裏,輸入csc -?,窗口中顯示了C#編譯器的命令行參數列表;一樣地,輸入vbc -?,窗口顯示VB編譯器的命令行參數列表。其中,有些參數在咱們用csc.exe編譯C#源文件時會用到。測試
1、編輯源程序spa
在C盤新建一個文件夾test,在文件夾裏建立一個記事本文件HelloWorld.txt。用記事本打開編輯這個文件,輸入C#代碼,注意輸入空格以縮進。以後將HelloWorld.txt後綴名改成HelloWorld.cs。*.cs是C#代碼文件的後綴名。命令行
2、打開Developer Command Prompt,啓動csc.exe編譯源程序3d
更換路徑到源程序所在文件夾下。調試
輸入csc HelloWorld.cs,啓動編譯。orm
編譯成功,在test文件夾下,能夠看到HelloWorld.cs已經被編譯成一個可執行程序HelloWorld.exe。
3、C#編譯器(csc.exe)的輸出選項
前面已經實現了用記事本編輯C#源程序並用csc.exe編譯,最後在文件夾下能夠成功打開編譯而來的可執行程序。如今,考慮編譯過程當中的一些細節。
源程序叫做HelloWorld.cs,編譯後的程序叫做HelloWorld.exe。看上去沒什麼問題,其實編譯後的程序的名字和類型是能夠經過C#編譯器的輸出選項(參數)指定的。
①/out 規定編譯後文件名字,若是不進行設置,編譯後文件名與源程序名字相同 ②/target:exe 編譯源程序成可執行的控制檯程序,缺省選項 ③/target:library 編譯源程序成*.dll程序集 ④/target:winexe 編譯源程序成窗體程序 (其中/target可縮寫成/t)
因此以前在編譯時,咱們輸入:csc HelloWorld.cs其實等價於輸入:csc /target:exe /out:HelloWorld.exe HelloWorld.cs,只是中間兩個選項都省略掉了。命令行選項和源文件的順序是任意的,能夠命令行選項在前,源文件在後。也能夠源文件在前,命令行選項在後,甚至能夠這樣寫:csc /target:exe HelloWorld.cs /out:HelloWorld.exe,這些都是能夠的。
打開Developer Command Prompt,進行其餘選項的測試。
此外,命令行輸出選項中的"/"符號還能夠換成"-"符號。
4、源程序中引用了外部程序集
修改源文件。using System.Windows.Forms引入了一個命名空間,以使用其中的MessageBox類的靜態方法Show(),彈出一個對話框顯示相關內容。System.Windows.Forms命名空間存在於System.Windows.Forms.dll程序集中(命名空間與程序集名稱相同)。源文件中使用了外部程序集的內容,csc.exe在編譯時須要經過/reference命令行選項指定引用的外部程序集(/reference可縮寫爲/r)。
下面進行編譯,省略/target和/out選項。
可能有讀者在這裏並無/reference:System.Windows.Forms,而是直接csc HelloWorld.cs,也能夠成功編譯並運行,在後文會對這個問題進行解答。(C#默認響應文件csc.rsp的概念)
這裏還有一個問題,在源文件中,使用System.Windows.Forms命名空間中的MessageBox類,須要引入這個命名空間所在的程序集System.Windows.Forms.dll,那使用System命名空間中的Console類,爲何不引入System命名空間所在的程序集System.dll?
這就涉及到了「外部程序集」中「外部」的概念。在Visual Studio中,引入System.Windows.Forms.dll程序集後,查看其包含的內容。能夠看到Show()方法是MessageBox類的靜態方法,MessageBox類是System.Windows.Forms命名空間中的成員,而這個命名空間又是System.Windows.Forms.dll程序集中的邏輯概念。下圖中,左側兩個小黑方塊中間用一槓連起來的那個符號就是程序集的符號,花括號的那個符號是命名空間的意思。
System.Windows.Forms.dll是外部程序集,那什麼又叫做「不是外部程序集」呢?查看System.dll程序集中的System命名空間的成員,發現並無咱們使用的Console類。
這是由於,咱們使用的Console.WriteLine()中的Console類所在的命名空間System,不是包含在System.dll中的!咱們查看mscorlib這個程序集。
Console類原來是mscorlib.dll程序集中System命名空間的成員。mscorlib(MicroSoft CORe LIBrary),相對於System.Windows.Forms等一些外部程序集來講,是.NET平臺中核心的程序集,能夠把它們理解成「內部的」程序集。因此回到以前的那個問題,使用mscorlib.dll程序集中命名空間中的成員,只要在源文件中使用using關鍵字引入所用成員所在的命名空間便可(也可以使用成員的徹底限定名),而不用在使用csc.exe編譯時經過/reference命令行選項額外引入mscorlib.dll這個程序集。
其實,在Visual Studio IDE裏看這個問題,也是相通的。在咱們新建了一個控制檯應用程序後,在解決方案管理器中References下會自動引入一些外部程序集。(mscorlib不顯示在其中,由於它不須要引入!)當須要使用MessageBox等一些沒有自動被引入的外部程序集中的成員時,就須要咱們手動右鍵References添加所用的程序集。而mscorlib.dll是在建立應用程序時就已經添加進來的程序集,不用額外引入。在IDE中是這樣,在命令行提示符中使用csc.exe編譯時也是這樣。
在Visual Studio中能夠看到程序集在磁盤中的路徑。
在Visual Studio中建立應用程序時會選擇.NET Framework的版本,由於例子中這個程序選擇的是.NET Framework 4.6.1,因此它引用的程序集就是磁盤中.NET Framework 4.6.1中的程序集。
進入這個文件夾,能夠看到其中包含的程序集。咱們看到mscorlib.dll這個程序集的容量很大,也反映出這個程序集的重要性。
若是csc.exe須要引入多個外部程序集,在/reference:程序集1;程序集2 中用英文分號";"分隔便可。
5、編譯多個源文件
如今咱們已經可使用csc.exe和記事本構建一個能夠引用外部程序集的控制檯應用程序了,可是咱們全部的代碼都是寫在一個C#源文件中的。咱們也能夠將代碼寫在多個文件中,使用csc.exe對多個源文件進行編譯。
在test文件夾下增長MyMessageBox.txt文件,以後要將後綴名改成.cs(下同)。
修改HelloWorld.txt文件。
打開Developer Command Prompt,編譯這兩個文件,注意依然要使用/reference引入使用的外部程序集。編譯的多個文件之間用空格隔開。
執行這個程序。
此外,在使用csc.exe編譯多個文件時,還可使用通配符"*"表示編譯當前目錄下的全部指定後綴名文件。如:csc *.cs表示編譯當前目錄下全部.cs文件。
6、使用C#響應文件
至此,咱們已經可使用csc.exe編譯多個源文件的C#應用程序了。在編譯過程當中,須要設置一些命令行選項以達到某種效果。當程序規模大到必定程度,就須要輸入不少的命令行選項,容易出錯且錄入工做量大。爲了應對這一問題,C#有響應文件(response file,後綴名爲rsp)的概念。C#響應文件包含編譯一個或多個C#源文件時須要指定的命令行選項。
編輯HelloWorld.rsp文件,將編譯源文件時須要用到的引入外部程序集、設置輸出程序的類型及名字等命令行選項寫在這個文件裏,並將這個響應文件和源程序文件放在同一目錄下。csc.exe編譯時,輸入csc @HelloWorld.rsp就能夠按照設置的命令行選項編譯這個C#源程序了。
程序能夠正常運行。
這裏有幾點須要注意的地方:①寫在後面的命令行選項或響應文件的內容會覆蓋掉前面的命令行選項或響應文件的內容(之後規定的爲準!) ②/reference具備累加性,最終程序引用的外部程序集爲各個地方(命令行選項和響應文件)規定的程序集的並集
7、關於C#默認的響應文件csc.rsp
回到以前提到的那個問題,爲何即便沒有使用/reference引入須要的外部程序集,程序也是能夠成功編譯並執行的?
C#編譯器(csc.exe)有一個與之關聯的默認響應文件(csc.rsp),csc.rsp與csc.exe在同一目錄下(我沒有找到..)。在編譯C#源程序時,不管有沒有本身編寫的響應文件,這個默認的響應文件csc.rsp都會執行。而csc.rsp已經寫好了對不少核心程序集的引用(用/reference或/r命令行選項)。因此即便咱們沒有使用/reference引入外部程序集,csc.rsp也幫咱們引入好了。
若是不想在編譯時自動執行csc.rsp,能夠指定/noconfig選項。
若是咱們在編譯時指定了/noconfig選項且沒有使用/reference引入源文件中須要的外部程序集,那麼編譯將報錯。
若是程序引用了在源文件中沒有用到的外部程序集(好比csc.rsp幫咱們自動引入的),它們將會被編譯器忽略,因此不會影響程序的質量。
返回目錄:C#學習筆記