1、編譯 C# 類
1.1、C# 編譯工具
csc.exe 是 Microsoft .NET Framework 中的 C# 編譯器,它支持很多編譯選項。在 cmd 中鍵入csc /help
,然后回車即可看到所有的 Visual C# 編譯器選項和說明。
csc.exe 中有 6 個帶默認值的選項。其中/out:<文件>
選項用於指定輸出文件名,可指定多個文件名甚至可以用通配符,默認取包含主類(含 Main 方法的類)的文件或第一個文件的基名稱(不含后綴);而/target:exe
選項表示生成控制台可執行文件,即默認生成以 exe 為后綴的可執行文件,該選項可縮寫為/t:exe
。
我通過百度大致的檢索了一下,發現大量關於 csc 的報錯問題居然是“csc 不是內部或外部命令……”。如果你看了本系列前面幾篇博文,相信你一眼就能看出這顯然不是一個有關 .NET 的問題,而是 Windows 的基礎問題。所有在這兒我還是簡單提一下,如果你恰好遇到這個問題,有如下兩個辦法:
- 第一個,把你本機的 .NET 主目錄加入到 path 環境變量中去,然后就可以通過 cmd 調用 csc 了。
- 第二個,找到你本機安裝的 Visual Studio 中提供的開發人員命令提示符工具(每個版本的 VS 都有提供,盡管路徑不一樣,但在開始菜單的 Visual Studio Tools 里面一般都能找到),它主要也就是提前幫你設置好了工具的執行路徑。
1.2、編譯一個 C# 類
第一步,將如下 C# 代碼保存為D:\Workspace\SayHello.cs
文件。
public class SayHello
{
public static void Main(string[] args)
{
System.Console.WriteLine("你好,C#");
System.Console.ReadKey();
}
}
第二步,在命令行中鍵入csc sayhello.cs
后回車即可完成編譯。如下圖所示:
編譯完成之后,你會發現 D:\Workspace 目錄下多了一個 SayHello.exe 文件,雙擊它的效果如下:
至於編譯生成的文件名為什么是 SayHello.exe,上一小節已經講過了。這里要說的是,假如你想讓它生成一個你指定名稱的可執行文件,比如指定為 chinese.exe 的話,那么你需要鍵入csc /out:chinese.exe sayhello.cs
命令並回車即可。
1.3、編譯多個 C# 類
第一步,將如下 C# 代碼保存為D:\Workspace\SayHello.cs
文件。
public class SayHello
{
public static void Main(string[] args)
{
System.Console.WriteLine("你好,C#");
Test.Try(); // 調用 Test 類中的 Try 方法
System.Console.ReadKey();
}
}
將如下 C# 代碼保存為D:\Workspace\Test.cs
文件。
public class Test
{
public static void Try()
{
System.Console.WriteLine("Just a try!");
}
}
第二步,在命令行中鍵入csc sayhello.cs test.cs
后並回車,再次雙擊 SayHello.exe 文件,效果如下:
再補充幾個命令:
csc /out:say.exe sayhello.cs test.cs
表示將 sayhello.cs 和 test.cs 兩個類文件編譯成 say.exe 文件。csc /out:sayall.exe *.cs
表示將當前目錄下的所有 C# 類文件編譯成 sayall.exe 文件。csc /utf8output *.cs
表示將當前目錄下的所有 C# 類文件按 UTF-8 編碼來編譯輸出。csc /target:library test.cs
表示將 test.cs 類文件編譯成 Test.dll 文件。csc /target:library /out:say.dll *.cs
表示將當前目錄下的所有 C# 類文件編譯成 say.dll 文件。
2、編譯 Java 類
2.1、Java 編譯工具
Java 的開發工具包是 JDK,在 JDK 中有用於編譯 Java 的工具 javac.exe,還有用於運行 Java 的工具 java.exe 等。javac 和 java 都有很多選項,且它們都有一個默認的參數-help
,這意味着如果你想了解它們全部的選項和說明,直接在 cmd 中鍵入工具名 javac 或 java 並回車即可。
事實上編譯 Java 類比編譯 C# 類要相對復雜一些。首先,javac.exe 會把 Java 代碼編譯成 class 文件,而不是可執行程序,這就意味着你還需要額外的工具(java.exe)來運行 Java 程序。其次,JDK 對編碼格式的處理不太好,常需要手工指定。再次,在調用 class 文件的時候,你必須確保大小寫完全一致,而且不能帶 class 后綴,否則就會報錯。
所以對初學者而言,通過命令行編譯 Java 代碼可能會遇到更多各種各樣的問題。同樣令人遺憾的是,網上關於“javac 不是內部或外部命令……”的問題也非常多,如果你遇到這個問題請仔細檢查你本機的 JDK 是否安裝成功,以及環境變量是否配置正確。
2.2、編譯 Java 類
第一步,將如下 Java 代碼保存為D:\Workspace\SayHello.java
文件。
public class SayHello{
public static void main(String[] args){
System.out.println("你好,Java");
}
}
第二步,在命令行中鍵入javac -encoding utf8 sayhello.java
后回車即可完成編譯。如下圖所示:
上述命令中的-encoding
參數理論上不是必須的,但實際上幾乎就是必須的。因為 javac.exe 會根據當前操作系統的默認編碼格式來轉化程序代碼(忽略文件編碼格式)。眾所周知 Windows 中默認編碼是 ANSI,對應到中國就是 GBK,而大多數文本編輯器默認都是 UTF-8,所以如果你不指定-encoding
參數的話編譯時就會報“編碼GBK的不可映射字符”的錯誤。
第三步,在命令行中鍵入java SayHello
后回車,效果如下所示:
上述命令中一定要注意大小寫一致的問題,而且不能帶 class 后綴,否則就會報錯。另外,編譯多個 Java 類與編譯多個 C# 類的思路完全一樣,這里就不再贅述了。
3、組合命令符
在本系列前面幾篇文章中已陸續出現了大部分命令行特殊字符。如:命令行回顯屏蔽符 @、批處理變量引導符 %、轉義字符 ^、通配符 *、字符串界定符 "(雙引號)、命令界定符 '(單引號)、重定向符 > 和 >>、命令管道符 | 等。本節再來說說命令行中的三個組合命令符 &、&& 以及 ||。
如下腳本(當命令正確運行到此處時,將逐行依次輸出 a、b、c):
if errorlevel==0 (
echo a
echo b
echo c
)
上述腳本還可以改寫成:
if errorlevel==0 (echo a & echo b & echo c)
或:
if errorlevel==0 (echo a && echo b && echo c)
&的語法是:第一條命令 & 第二條命令 [& 第三條命令...],表達式中的所有命令都將被執行,即便前面的命令執行失敗了,后面的命令也依舊會被執行。
&&的語法是:第一條命令 && 第二條命令 [&& 第三條命令...],表達式中的命令將依次被執行,如果遇到錯誤將不再執行后面的命令,只有執行一直不出錯的情況下才會執行完所有命令。
如果把前面那個腳本改寫成(則只會輸出 a):
if errorlevel==0 (echo a || echo b || echo c)
||的語法是:第一條命令 || 第二條命令 [|| 第三條命令...],與 && 恰恰相反的是,僅當 || 前面的命令執行執行失敗時才會執行后面的命令。如果第一條命令執行成功就只會執行第一條命令,當第一條命令執行失敗后才會執行第二條命令,只有當前面的所有命令都執行失敗時,才會執行到最后一條命令。
額外補充:本系列前幾篇博文中多次出現echo.
,它的作用是返回一個空行。需要注意的是 echo 和后面的點得緊挨着,中間不能有空格,否則就會直接輸出點了。其實 echo 后面的點還可以用逗號(,)、分號(😉、冒號(😃、加號(+)、正斜線(/)、反斜線()、前中括號([)、后中括號(])里的任意一個字符來代替。
4、總結
4.1、學校里學的有沒有用?
通過命令行手工編譯類的知識往往只有科班才會講解,有些培訓結構和入門書籍中提都沒提。我當初因為打字太慢沒跟上節奏,看到四周的同學全都編譯通過了,而我連類的代碼都還沒敲完。晚上回到宿舍后本想上網查資料繼續完成白天沒完成的內容,結果卻看到很多人說沒必要學這個,公司里都用 IDE,學校里學的沒用……最后,我放棄了,同時我內心也產生了一些疑問,學校里學的這些真的沒用嗎?如果是這樣,那老師為什么還要講呢?
直到工作后的某一天,我遇到一個似乎超出能力范圍的問題,現如今我已記不清楚是什么問題了。但我清楚的記得,網上某位大神給出的解決方案就是調出 cmd 然后鍵入幾個命令回車即可,我照做之后果然搞定了。於是乎,我也慢慢開始嘗試用 cmd 解決一些用圖形化工具不好解決的問題。
后來我才逐漸理解,學習命令行手工編譯相關知識,有助於讓學生了解編譯和執行的過程,加深學生的記憶和理解程度,鍛煉學生的動手能力,培養學生的程序化思維。一個負責任的老師絕不希望自己的學生是那種只會用 IDE 等自動化工具,卻沒有思考和動手能力的人!
再后來我甚至開始勸告身邊的某些人,別總把“學校里學的沒用”掛嘴邊!學校里你的老師主要是幫你搞好學習,因為學校主要看你學的怎么樣;而公司里你的上司主要是幫你完成工作,因為公司主要看你干的怎么樣。考核指標都變了,你又怎么能指望學校里學的東西能完全用到公司呢?即便你上家公司學到的東西也不能完全用到下家公司吧!
對於“學校里學的有沒有用”這個問題,我后來一貫的主張是:如果你覺得學校里學的沒用,那肯定是因為你沒用!要么你選錯了學習方向,學了卻用不上;要么你根本沒學會,學過卻不知道有什么用!
4.2、本文總結
本文主要講解了如何通過命令行工具來手工編譯 C# 類和 Java 類。盡管有很多程序最終跑在 Linux 上,但絕大部分程序員依然是用 Windows 做開發。所以做為一名程序員,如果能學着用命令行工具,並在必要的時候合理運用,定能更快更好的完成開發任務。
事實上有些任務我們也只能用命令行工具來完成,因為 IDE 可能並沒有提供相關功能或相關功能太不好用。譬如在 .NET 平台上,向 IIS 重新注冊 Asp.Net 得用aspnet_regiis -i
命令,注冊系統服務得用installutil myService.exe
命令,卸載系統服務得用installutil myService.exe -u
命令等。事實上,無論是 .NET 平台還是 Java 平台,官方都提供了很多命令行工具。
C#/.NET 平台的命令行工具官方參考鏈接:
Java 平台的命令行工具相關參考鏈接:
4.3、本系列總結
本系列博文主要介紹了 Windows 命令行的基本使用方法和常見命令腳本,而且 cmd.exe 支持的命令 powershell.exe 一般也都能支持。本系列內容主要是結合 cmd.exe 來展開的,畢竟調用 cmd 更方便,我本人也更熟悉 cmd 一些。
下面是我在寫本系列時搜集到的一些有關 Windows 命令行的參考站點或帖子(盡管本次寫作過程中沒用上,但以后再用到命令行的時候也許就能派上用場了,哈哈!):
本文鏈接:http://www.cnblogs.com/hanzongze/p/cmd-compiles.html
版權聲明:本文為博客園博主 韓宗澤 原創,作者保留署名權!歡迎通過轉載、演繹或其它傳播方式來使用本文,但必須在明顯位置給出作者署名和本文鏈接!個人博客,能力有限,若有不當之處,敬請批評指正,謝謝!