C#的編譯過程
如何用CSC.exe來編譯Visual C#的代碼檔案
Csc.exe 編譯器的位置路徑:C:\Windows\Microsoft.NET\Framework64\v4.0.30319
如何編譯:
1.為了使用友善,你可以手動把上面的目錄添加到Path環境變量中去
2.用Csc.exe編譯HelloWorld.cs非常簡單,打開指令提示符,并切換到存放 HelloWorld.cs檔案的目錄中,輸入下列行指令:
Csc /r:system.dll HelloWorld.cs
指令選項:
#
Option
Remark
1
@
這個選項是用來指定響應檔案。響應檔案是一種包含了許多編譯選項的檔案。這些編譯選項将和源代碼檔案一起由編譯器進行處理。一般來說此種響應檔案是以文本檔案形式出現。他的擴充名.rsp。在響應檔案中是用#符号表示開始的注釋。
例:以下是一個響應檔案resp1.rsp的内容:
# 這是一個簡單的響應檔案,檔案名稱為resp1.rsp
#使用方法: csc @resp1.rsp /target:exe /out:sample.exe sample.cs
此響應檔案的作用就是把sample.cs檔案編譯成sample.exe檔案。如果在一次編譯中要指定多個響應檔案,可以指定多個響應檔案選項,如:@file1.rsp @file2.rsp
2
/? 與 /help
3
/addmodule
本選項是使編譯器搜集從使用者正在編譯的工程到可用檔案中所有類型的資訊。所有添加了/addmodule的子產品在運作時必須與輸出檔案在同一目錄中。這就是說,使用者可以在編譯時指定任何目錄中的子產品,但在運作時這個子產品必須在應用程式目錄中。檔案中不能包含彙編名單。例如:如果輸出檔案用/taarget:module建立,其中繼資料可以用/addmodule導入。
例子:把二個子產品加入myProject.cs中 csc /addmodule:module1.dll;module2.dll myProject.cs
4
/baseaddress
本選項允許使用者指定載入DLL時的首選位址,這個首選位址可以是十進制、十六進制、八進制。DLL的預設首選位址在.Net運作時設定。如果目标檔案不是DLL檔案,這個選項将被忽略。
例子:把myLibrary.cs編譯成DLL檔案,并且當此DLL在.Net運作環境被載入時的位址是0x1111000:csc /baseaddres:0x1111000 /target:library myLibrary.cs
5
/bugreport
這個選項用來報告編譯時的錯誤資訊。在報告中包含以下内容:
1).編譯中所有源代碼的一個拷貝
2).在編譯中所有的編譯選項
3).編譯資訊,包括編譯器、運作時間、作業系統的版本資訊
4).編譯器輸出
5).問題的描述
6).如何解決問題的描述
例子:生成一個bugs.txt檔案,并把錯誤報告放在檔案裡面
csc /bugreport:bugs.txt Hello.cs
6
/checked
此選項指定不在檢驗或或者未檢驗關鍵字範圍内以及導緻超出資料類型範圍的值的整數計算語句是否産生運作例外。具體的說就是,如果不在檢驗或者未檢驗關鍵字範圍内的整數計算語句産生的值在資料類型允許的範圍之外,并且在編譯中使用了/checked+(/checked),該語句就會在運作時産生例外,如果在編譯時使用了/checked-,在運作時該語句就不會産生例外。
例子:編譯myMath.cs,并且指定一個不在檢驗或者未檢驗關鍵字範圍内的整數計算語句(且其産生的值超出資料類型的範圍),将在運作時引起例外。
csc /checked+ myMath.cs
7
/codepage
如果使用者編譯的一個或者多個源代碼不使用計算機上的預設代碼頁,可以使用/codepage選項來指定希望使用的代碼頁。/codepage适用于編譯中所有的源代碼檔案。
如果源代碼檔案在計算機上的同一個代碼頁位置建立,或者源代碼檔案用UNICODE或者UTF-8來建立,使用者就不需要使用/codepage了。
8
/debug
此選項是在調試時候使用的,當調試者啟用了這個選項來調試自己的程式,将會建立一個.pdb檔案,并把各種調試資訊寫到此檔案裡。有兩選項來指定調試的類型:
/debug [+/-] :當選用/debug +就會把建立.pdb檔案,并把調試資訊存儲到裡面;/debug -是一個預設設定,就是不産生任何調試資訊。
/debug:[full/pdbonly] :當使用/debug:full就是建立預設的調試資訊,有點類似/debug+選項。/debug: pdbonly選項是建立.pdb檔案,并且你隻能使用源代碼調試在調試工具裡。
例子:編譯Hello.cs并且為Hello.cs建立調試資訊
csc /debug+ HelloWorld.cs
9
/define
此選項在程式中定義了一個符号,他和在源程式中使用#define預處理程式訓示功能相同,此符号保持已定義狀态,直到源檔案中的#undefine訓示符删除定義或者編譯器已到達了檔案末尾。你可以用/d簡寫來代替。
例子:下面是my.cs的源程式
using System;
public class myBuild
{
public static void Main()
#if (final)
Console.WriteLine("Final Build");
Console.ReadLine();
#else
Console.WriteLine("Trial Build");
#endif
}
如果用csc /define:final my.cs來編譯就會顯示"Final Build",如果沒有/define,編譯後執行就會顯示"Trial Build"。
10
/doc
文檔在當今已經變得愈來愈重要了,一個好的程式應該配有相當的文檔。如果你在寫程式的文檔中用的是"///"辨別符來注釋。當你使用/doc選項來編譯時,你的是以注釋文檔将會自動的保留在一個XML檔案中。
例子:以下是my.cs 的源程式
/// <summary>
/// This is a sample class that has some documentation
/// </summary>
/// Main entry point of the class
用下列編譯語句會産生my.xml檔案,看看my.xml檔案到底存儲了什麼東西。
Csc /doc:my.xml my.cs
11
/fullpaths
在預設情況下,編譯産生的錯誤或者警告都隻會指明發現錯誤的檔案名稱,加入此選項使得在編譯器産生錯誤或者警告的時候會顯示完整的路徑。你可以把上面的my.cs程式文法搞錯,再用 csc /fullpaths my.cs 和 csc my.cs分别編譯,看看錯誤提示有什麼不同。
12
/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。
13
/linkresource
這個選項就是在輸出檔案中建立到.Net資源的連結。他的簡寫是/linkres。資源檔案就是在那些在工程檔案中使用到的所有的資源,像圖檔、聲音等。這個選項隻是對于資源檔案建立連結,這樣有助于管理使用同一資源的程式,而不需要多個副本。此選項的具體文法如下:
/linkresource:filename,identifier,mimetype
其中:
filename:是想建立連結的.Net的資源檔案
identifier(可選):資源的邏輯名稱,該名稱用于載入資源,預設名稱是檔案名稱。
mimetype(可選):是一個代表資源的媒介類型的字元串。預設為空。
例子:在檔案中建立一個指向reso.resource的連結
csc /linkres:reso.resource myResource.cs
14
/main
當我們編譯二個或者多個擁有Main方法的Class,我們可以使用這個選項讓使用者指定最終的輸出檔案中的使用那個Main的方法。
例子:編譯二個檔案,但輸出檔案中的Main方法來自Main1 Class
csc myMain1.cs myMain2.cs /main:Main1
15
/nologo
這個選項禁止在編譯器啟動時顯示開始标志和編譯過程中顯示報告資訊。
例子:csc /nologo my.cs
16
/nooutput
編譯檔案,但不建立任何輸出檔案。使用者可以看到任何編譯錯誤和警告。
例子:csc /nooutput my.cs
17
/nostdlib
這個選項禁止導入mscorlib.dll。這個DLL包含了這個系統名稱空間。當使用者希望使用自己的系統名稱空間時,一般才會使用此選項。
例子:編譯檔案,但不導入mscorlib.dl
csc /nooutput myOutput.cs
18
/nowarn
選項是在編譯過程中禁止指定的警告類型。如果是禁止多個警告類型,用逗号分隔。
例子:在編譯過程中禁止警告類型CS0108和CS0109
csc /nowarn:108,109 Warn.cs
19
/optimize
本選項激活或者禁用由編譯器執行優化。優化的結果是使得輸出檔案更小、更快、更有效率。預設是/optimize執行優化,如果你選用了/optimize-則禁止優化。/o是/optimize的簡寫。
例子:編譯檔案,并禁止優化
csc /optimise- my.cs
20
/out
在沒有指定輸出檔案的情況下,如果通過編譯器編譯後檔案是EXE檔案,則輸出檔案将從包含Main方法的源代碼的檔案中獲得名字;如果編譯後的檔案是DLL檔案,将從第一個源代碼檔案中獲得名字。如果使用者想要指定輸出檔案名稱,就可以使用此選項。
例子:編譯HelloWord.cs檔案,并把輸出檔案命名為Hello.exe
csc /out:Hello.exe helloworld.cs
21
/recurse
此選項允許使用者編譯在指定目錄或者工程目錄的所有子目錄中的所有源代碼檔案。使用者可以使用通配符來編譯工程目錄下的所有比對檔案。
例子:編譯/dir1/dir2目錄下及其下級目錄中的所有C#檔案,并生成dir2.dll
csc /target:library /out:dir2.dll /recurse: dir1\dir2\*.cs
22
/refrence
此選項可使得目前編譯工程使用指定檔案中的公共類型資訊。這個選項對于初學者是很重要的。此選項的簡寫是/r。你必須引用在程式代碼中使用"using"關鍵字導入的所有檔案,如果在你的程式中,使用了自己編寫的類庫,在編譯時也必須引用。
例子:編譯檔案,并引用在程式中使用的檔案
csc /r:system.dll;myExec.exe;myLibrary.dll myProject.cs
(注:其中那個myExec.exe和myLibrary.dll時自己建立的)
23
/target
這個選項是告訴編譯器你所想得到什麼類型的輸出檔案。除非使用/target:module選項,其他選項建立的輸出檔案都包含着彙編名單。彙編名單存儲着編譯中所有檔案的資訊。在一個指令行中如果生成多個輸出檔案,但隻建立一個彙編名單,并存儲在第一個輸出檔案中。
下面是/target的4種用法:
/target:exe 建立一個可執行(EXE)的控制台應用程式
/target:library 建立一個代碼庫(DLL)
/target:winexe 建立一個windows程式(EXE)
/target:module 建立一個子產品(DLL)
例子:
csc /target:exe myProj.cs // 建立一個EXE檔案
24
/resource
此選項和/linkresource正好相反。他的作用是把.Net資源檔案嵌入到輸出檔案中,參數、用法都和/linkresource也相同,具體可參考前面/linkresource選項。
25
/unsafe
此選項是告訴編譯器采用非安全模式編譯檔案
例子:用非安全模式編譯my.cs
csc /unsafe my.cs
26
/warn
使用本選項是在編譯過程中采用什麼等級的警告級别。警告級别含義:0關閉所有警告;1隻顯示嚴重警告;2級别為1的警告和某些不嚴重的警告;3級别為2的警告和某些不算非常嚴重的警告;4 級别為3的警告和資訊警告
例子:編譯檔案,不顯示任何錯誤
csc /warn:0 my.cs
27
/warnaserror
告訴編譯器把在編譯中把所有的警告當成錯誤來處理。/warnaserror-是預設選項,在該選項下編譯中的警告不影響檔案的輸出。/warnaserror和/warnaserror+是一樣的。
例子:編譯檔案,并在編譯中把警告當成錯誤
csc /warnaserror myj.cs
28
/win32icon
在輸出檔案中插入一個圖示檔案(.ico)。進而在Windows中的資料總管中就看到以此圖示辨別的檔案了。
例子:csc /win32icon:myicon.ico my.cs
29
/win32res
在輸出檔案中添加一個win32的資源檔案。此資源檔案包括使用者應用程式的版本資訊或者位圖(圖示)資訊。如果使用者不指定/win32res,編譯器将根據彙編版本生成版本資訊。
例子:添加一個win32資源檔案到輸出檔案中
csc /win32res:winrf.res mt.cs