Visual C#是微軟公司推出的新一代程序開發語言,Visual C#是微軟公司.Net FrameWork框架中的一個重要的組成部分,也是微軟公司向程序員極力推薦一個新的程序開發平台。和以往的開發語言相比較,他有更強大功能,更高的穩定性和更高的安全性。也正因為如此,Visual C#正在受到越來越多的編程愛好者的歡迎。
Visual C#的編譯器和以往編程語言的編譯器有著明顯的不同。其最大的不同點就是,以往的程序編譯器是把編寫好的程序代碼編譯生成可以直接為計算機所使用的機器語言。雖然Visual C#的編譯器也可以把編寫好的程序代碼編譯成EXE或者是DLL文件,但這種文件只是一種IL文件(中間語言),此IL文件不能直接被計算機使用。只是當此IL文件被調用的時候,再通過一種名叫JIT(即時編譯)編譯器把此IL文件生成可以供計算機使用的機器代碼。
可見Visual C#的編譯過程大致可以分成二個部分,第一個部分,從程序代碼到IL文件,這個過程是通過人工干預來實現的,即通過CSC.exe來實現的;第二個部分,從IL文件到機器語言,這個工程是機器自動實現的。本文就將具體來說明一下第一個部分,即如何用CSC.exe來正確編譯Visual C#文件。
CSC.exe把Visual C#程序代碼編譯成IL文件時,有著很多參數和開關選項。正確的了解和運用這些參數和開關有時會解決一些看似很棘手的問題。下面就通過一張表來大致說明一下這些參數和開關的具體作用。這些參數和開關選項是按照字母順序來排列的。其中帶"*",是一些常用的參數或開關。
選項 用途 @ * 指定響應文件。 /?, /help 在控制台的計算機屏幕上顯示編譯器的選項 /addmodule 指定一個或多個模塊為集會的一部分 /baseaddress 指定裝入DLL的基礎地址 /bugreport 創建一個文件,該文件包含是報告錯誤更加容易的信息 /checked 如果整數計算溢出數據類型的邊界,則在運行時產生一個例外的事件 /codepage 指定代碼頁以便在編譯中使用的所有源代碼文件 /debug * 發送調試信息 /define 定義預處理的程序符號 /doc * 把處理的文檔注釋為XML文件 /fullpaths 指定編譯輸出文件的反正路徑 /incremental 對源代碼的文件進行增量編譯 /linkresource 把.NET資源鏈接到集合中 /main 指定Main方法的位置 /nologo 禁止使用編譯器的標志信息 /nooutput 編譯文件但不輸出文件 /nostdlib 不導出標准庫(即mscorlib.dll) /nowarn 編譯但編譯器並不顯示警告功能 /optimize 打開或者關閉優化 /out * 指定輸出文件 /recurse 搜索編譯源文件的子目錄 /reference * 從包含集合的文件中導入元數據 /target * 指定輸出文件的格式 /unsafe 編譯使用非安全關鍵字的代碼 /warn 設置警告級別 /warnaserror 提升警告為錯誤 /win32icon 插入一個.ico文件導輸出文件中去 /win32res 插入一個Win32資源導輸出文件中 具體說明:
一.@
這個選項是用來指定響應文件。響應文件是一種包含了許多編譯選項的文件。這些編譯選項將和源代碼文件一起由編譯器進行處理。一般來說此種響應文件是以文本文件形式出現。他的擴展名是.rsp。在響應文件中是用#符號表示開始的注釋。
例:以下是一個響應文件resp1.rsp的內容:
# 這是一個簡單的響應文件,文件名稱為resp1.rsp
#使用方法: csc @resp1.rsp
/target:exe /out:sample.exe sample.cs
此響應文件的作用就是把sample.cs文件編譯成sample.exe文件。如果在一次編譯中要指定多個響應文件,可以指定多個響應文件選項,如:
@file1.rsp @file2.rsp
二./?和/help
這個選項應該不必多說,那些用過DOS程序的人,大概都會用這個選項。
三./addmodule
本選項是使編譯器搜集從用戶正在編譯的工程到可用文件中所以類型的信息。所有添加了/addmodule的模塊在運行時必須與輸出文件在同一目錄中。這就是說,用戶可以在編譯時指定任何目錄中的模塊,但在運行時這個模塊必須在應用程序目錄中。文件中不能包含匯編名單。例如:如果輸出文件用/taarget:module創建,其元數據可以用/addmodule導入。
例子:把二個模塊加入myProject.cs中
csc /addmodule:module1.dll;module2.dll myProject.cs
四./baseaddress
本選項允許用戶指定載入DLL時的首選地址,這個首選地址可以是十進制、十六進制、八進制。DLL的缺省首選地址在.Net運行時設置。如果目標文件不是DLL文件,這個選項將被忽略。
例子:把myLibrary.cs 編譯程DLL文件,並且當此DLL在.Net運行環境被載入時的地址是0x1111000
csc /baseaddres:0x1111000 /target:library myLibrary.cs
五./bugreport
這個選項用來報告編譯時的錯誤信息。在報告中包含以下內容:
1).編譯中所有源代碼的一個拷貝
2).在編譯中所有的編譯選項
3).編譯信息,包括編譯器、運行時間、操作系統的版本信息
4).編譯器輸出
5).問題的描述
6).如何解決問題的描述
例子:生成一個bugs.txt文件,並把錯誤報告放在文件裡面
csc /bugreport:bugs.txt Hello.cs
六./checked
此選項指定不在檢驗或或者未檢驗關鍵字范圍內以及導致超出數據類型范圍的值的整數計算語句是否產生運行例外。具體的說就是,如果不在檢驗或者未檢驗關鍵字范圍內的整數計算語句產生的值在數據類型允許的范圍之外,並且在編譯中使用了/checked+(/checked),該語句就會在運行時產生例外,如果在編譯時使用了/checked-,在運行時該語句就不會產生例外。
例子:編譯myMath.cs,並且指定一個不在檢驗或者未檢驗關鍵字范圍內的整數計算語句(且其產生的值超出數據類型的范圍),將在運行時引起例外。
csc /checked+ myMath.cs
七./codepage
如果用戶編譯的一個或者多個源代碼不使用計算機上的默認代碼頁,可以使用/codepage選項來指定希望使用的代碼頁。/codepage適用於編譯中所有的源代碼文件。
如果源代碼文件在計算機上的同一個代碼頁位置創建,或者源代碼文件用UNICODE或者UTF-8來創建,用戶就不需要使用/codepage了。
八./debug
此選項是在調試時候使用的,當調試者啟用了這個選項來調試自己的程序,將會創建一個.pdb文件,並把各種調試信息寫到此文件裡。有2中選項來指定調試的類型:
/debug [+/-] :當選用/debug +就會把創建.pdb文件,並把調試信息存儲到裡面;/debug -是一個缺省設置,就是不產生任何調試信息。
/debug:[full/pdbonly] :當使用/debug:full就是創建缺省的調試信息,有點類似/debug+選項。/debug: pdbonly選項是創建.pdb文件,並且你只能使用源代碼調試在調試工具裡。
例子:編譯Hello.cs並且為Hello.cs創建調試信息
csc /debug+ HelloWorld.cs
九./define
此選項在程序中定義了一個符號,他和在源程序中使用#define預處理程序指示功能相同,此符號保持已定義狀態,直到源文件中的#undef指示符刪除定義或者編譯器已到達了文件末尾。你可以用/d簡寫來代替。
例子:下面是my.cs的源程序
using System;
public class myBuild{
public static void Main() {
#if (final)
Console.WriteLine("Final Build");
#else
Console.WriteLine("Trial Build");
#endif
}
}
如果用csc /define:final my.cs來編譯就會顯示"Final Build",如果沒有/define,編譯後執行就會顯示"Trial Build"。
十./doc
文檔在當今已經變得愈來愈重要了,一個好的程序應該配有相當的文檔。如果你在寫程序的文檔中用的是"///"標識符來注釋。當你使用/doc選項來編譯時,你的所以注釋文檔將會自動的保留在一個XML文件中。
例子:以下是my.cs 的源程序
using System ;
///
/// This is a sample class that has some documentation
///
public class myDocument {
///
/// Main entry point of the class
///
public static void Main (string[] argv)
{
Console.WriteLine("A Sample Class") ;
}
}
用下列編譯語句會產生my.xml文件,看看my.xml文件到底存儲了什麼東西。
Csc /doc:my.xml my.cs
十一./fullpaths
在默認情況下,編譯產生的錯誤或者警告都只會指明發現錯誤的文件名稱,加入此選項使得在編譯器產生錯誤或者警告的時候會顯示完整的路徑。你可以把上面的my.cs程序語法搞錯,再用 csc /fullpaths my.cs 和 csc my.cs分別編譯,看看錯誤提示有什麼不同。
十二./incremental
本選項主要是激活增量編譯器,這種編譯器只對上次編譯後發生改變的函數進行編譯。如果在編譯時候選用了/debug選項,調試信息的狀態存儲在相應的.pdb文件中。除此編譯時的信息都存儲在.incr文件中,此.incr文件的名稱為output_file_name.extension.incr。即如果輸出文件時out.exe,則此文件對應的incr文件是out.exe.incr文件。
例子:利用增量編譯器來編譯文件
csc /incremental /out:my.exe my.cs
如果編譯成功則會產生2個文件,分別是:my.exe和my.exe.incr。
十三./linkresource
這個選項就是在輸出文件中創建到.Net資源的鏈接。他的簡寫是/linkres。資源文件就是在那些在工程文件中使用到的所有的資源,像圖片、聲音等。這個選項只是對於資源文件建立鏈接,這樣有助於管理使用同一資源的程序,而不需要多個副本。此選項的具體語法如下:
/linkresource:filename,identifier,mimetype
其中:
filename:是想建立鏈接的.Net的資源文件
identifier(可選):資源的邏輯名稱,該名稱用於載入資源,默認名稱是文件名稱。
mimetype(可選):是一個代表資源的媒介類型的字符串。默認為空。
例子:在文件中建立一個指向reso.resource的鏈接
csc /linkres:reso.resource myResource.cs
十四./main
當我們編譯二個或者多個擁有Main方法的Class,我們可以使用這個選項讓用戶指定最終的輸出文件中的使用那個Main的方法。
例子:編譯二個文件,但輸出文件中的Main方法來自Main1 Class
csc myMain1.cs myMain2.cs /main:Main1
十五./nologo
這個選項禁止在編譯器啟動時顯示開始標志和編譯過程中顯示報告信息。
例子:
csc /nologo my.cs
十六./nooutput
編譯文件,但不創建任何輸出文件。用戶可以看到任何編譯錯誤和警告。
例子:
csc /nooutput my.cs
十七./nostdlib
這個選項禁止導入mscorlib.dll。這個DLL包含了這個系統名稱空間。當用戶希望使用自己的系統名稱空間時,一般才會使用此選項。
例子:編譯文件,但不導入mscorlib.dl
csc /nooutput myOutput.cs
十八./nowarn
本選項是在編譯過程中禁止指定的警告類型。如果是禁止多個警告類型,用逗號分隔。
例子:在編譯過程中禁止警告類型CS0108和CS0109
csc /nowarn:108,109 Warn.cs
十九./optimize
本選項激活或者禁用由編譯器執行優化。優化的結果是使得輸出文件更小、更快、更有效率。缺省是/optimize執行優化,如果你選用了/optimize-則禁止優化。/o是/optimize的簡寫。
例子:編譯文件,並禁止優化
csc /optimise- my.cs
二十./out
在沒有指定輸出文件的情況下,如果通過編譯器編譯後文件是EXE文件,則輸出文件將從包含Main方法的源代碼的文件中獲得名字;如果編譯後的文件是DLL文件,將從第一個源代碼文件中獲得名字。如果用戶想要指定輸出文件名稱,就可以使用此選項。
例子:編譯HelloWord.cs文件,並把輸出文件命名為Hello.exe
csc /out:Hello.exe helloworld.cs
二十一./recurse
此選項允許用戶編譯在指定目錄或者工程目錄的所以子目錄中的所有源代碼文件。用戶可以使用通配符來編譯工程目錄下的所有匹配文件。
例子:編譯/dir1/dir2目錄下及其下級目錄中的所有C#文件,並生成dir2.dll
csc /target:library /out:dir2.dll /recurse: dir1\dir2\*.cs
二十二./refrence
此選項可使得當前編譯工程使用指定文件中的公共類型信息。這個選項對於初學者是很重要的。此選項的簡寫是/r。你必須引用在程序代碼中使用"using"關鍵字導入的所有文件,如果在你的程序中,使用了自己編寫的類庫,在編譯時也必須引用。
例子:編譯文件,並引用在程序中使用的文件
csc /r:system.dll;myExec.exe;myLibrary.dll myProject.cs
(注:其中那個myExec.exe和myLibrary.dll時自己創建的)
二十三./target
這個選項是告訴編譯器你所想得到什麼類型的輸出文件。除非使用/target:module選項,其他選項創建的輸出文件都包含著匯編名單。匯編名單存儲著編譯中所有文件的信息。在一個命令行中如果生成多個輸出文件,但只創建一個匯編名單,並存儲在第一個輸出文件中。
下面是/target的4種用法:
/target:exe 創建一個可執行(EXE)的控制台應用程序
/target:library 創建一個代碼庫(DLL)
/target:winexe 創建一個windows程序(EXE)
/target:module 創建一個模塊(DLL)
例子:
csc /target:exe myProj.cs // 創建一個EXE文件
csc /target:winexe myProject.cs file://創建一個windows程序
csc /target:library myProject.cs file://創建一個代碼庫
csc /target:module myProject.cs file://創建一個模塊
二十四./resource
此選項和/linkresource正好相反。他的作用是把.Net資源文件嵌入到輸出文件中,參數、用法都和/linkresource也相同,具體可參考前面/linkresource選項。
二十五./unsafe
此選項是告訴編譯器采用非安全模式編譯文件
例子:用非安全模式編譯my.cs
csc /unsafe my.cs
二十六./warn
使用本選項是在編譯過程中采用什麼等級的警告級別
警告級別 含義 0 關閉所有警告 1 只顯示嚴重警告 2 級別為1的警告和某些不嚴重的警告 3 級別為2的警告和某些不算非常嚴重的警告 4 級 別為3的警告和信息警告
例子:編譯文件,不顯示任何錯誤
csc /warn:0 my.cs
二十七./warnaserror
告訴編譯器把在編譯中把所有的警告當成錯誤來處理。/warnaserror-是缺省選項,在該選項下編譯中的警告不影響文件的輸出。/warnaserror和/warnaserror+是一樣的。
例子:編譯文件,並在編譯中把警告當成錯誤
csc /warnaserror myj.cs
二十八./win32icon
在輸出文件中插入一個圖標文件(.ico)。從而在Windows中的資源管理器中就看到以此圖標標識的文件了。
例子:
csc /win32icon:myicon.ico my.cs
二十九./win32res
在輸出文件中添加一個win32的資源文件。此資源文件包括用戶應用程序的版本信息或者位圖(圖標)信息。如果用戶不指定/win32res,編譯器將根據匯編版本生成版本信息。
例子:添加一個win32資源文件到輸出文件中
csc /win32res:winrf.res mt.cs
以上就是Csc.exe在編譯C#文件中的全部選項。了解並掌握這些選項有時對我們編程是大大有用的。