[C#學習筆記1]用csc.exe和記事本寫一個C#應用程式

来源:https://www.cnblogs.com/wangmengdx/archive/2018/10/05/9745980.html
-Advertisement-
Play Games

不使用Visual Studio等IDE,只使用csc.exe和記事本構建一個C#控制台應用程式。 ...


csc.exe是C#的命令行編譯器(CSharpCompiler),可以編譯C#源程式成可執行程式。它與Visual Studio等IDE(Integrated Development Environment,集成開發環境)的區別是,csc.exe只是將用C#語言編寫的源程式文件編譯成.exe、.dll等文件,它只是一個編譯器,而IDE提供豐富的調試、運行功能,提供很多view視圖以及解決方案管理器等文件組織功能。

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的最新版本及之前的版本。

.NET Framework Developer Pack下載地址

 

如果不想那麼麻煩,可以直接安裝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路徑,就可以在這裡直接使用了。

CMD

Developer Command Prompt for VS 2017

比如這裡,輸入csc -?,視窗中顯示了C#編譯器的命令行參數列表;同樣地,輸入vbc -?,視窗顯示VB編譯器的命令行參數列表。其中,有些參數在我們用csc.exe編譯C#源文件時會用到。

C#命令行參數

VB命令行參數


一、編輯源程式

  在C盤新建一個文件夾test,在文件夾里創建一個記事本文件HelloWorld.txt。用記事本打開編輯這個文件,輸入C#代碼,註意輸入空格以縮進。之後將HelloWorld.txt尾碼名改為HelloWorld.cs。*.cs是C#代碼文件的尾碼名。

  用記事本編輯源文件

二、打開Developer Command Prompt,啟動csc.exe編譯源程式

  更換路徑到源程式所在文件夾下。

  更換路徑到源程式所在文件夾下

  輸入csc HelloWorld.cs,啟動編譯。

  編譯成功

  編譯成功,在test文件夾下,可以看到HelloWorld.cs已經被編譯成一個可執行程式HelloWorld.exe。

  源程式已經被編譯成了可執行程式

  HelloWorld

三、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,進行其他選項的測試。

  測試1

  此外,命令行輸出選項中的"/"符號還可以換成"-"符號。

  命令行選項中可以換一個符號

 

四、源程式中引用了外部程式集

  修改源文件。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.Windows.Forms.dll是外部程式集,那什麼又叫作“不是外部程式集”呢?查看System.dll程式集中的System命名空間的成員,發現並沒有我們使用的Console類。

  外部程式集System.dll中並沒有Console類

  這是因為,我們使用的Console.WriteLine()中的Console類所在的命名空間System,不是包含在System.dll中的!我們查看mscorlib這個程式集。

  mscorlib.dll

  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中可以看到程式集在磁碟中的路徑。

  mscorlib的路徑

  在Visual Studio中創建應用程式時會選擇.NET Framework的版本,因為例子中這個程式選擇的是.NET Framework 4.6.1,所以它引用的程式集就是磁碟中.NET Framework 4.6.1中的程式集。

  .NET Framework 4.6.1的程式

  .NET Framework 4.6.1文件夾

  進入這個文件夾,可以看到其中包含的程式集。我們看到mscorlib.dll這個程式集的容量很大,也反映出這個程式集的重要性。

  文件夾下的mscorlib.dll

  如果csc.exe需要引入多個外部程式集,在/reference:程式集1;程式集2 中用英文分號";"分隔即可。

五、編譯多個源文件

  現在我們已經可以使用csc.exe和記事本構建一個可以引用外部程式集的控制台應用程式了,但是我們所有的代碼都是寫在一個C#源文件中的。我們也可以將代碼寫在多個文件中,使用csc.exe對多個源文件進行編譯。

  在test文件夾下增加MyMessageBox.txt文件,之後要將尾碼名改為.cs(下同)。

  增加MyMessageBoxtxt文件

  修改HelloWorld.txt文件。

  修改HelloWorldtxt文件

  打開Developer Command Prompt,編譯這兩個文件,註意依然要使用/reference引入使用的外部程式集。編譯的多個文件之間用空格隔開。

  成功編譯多個文件

  執行這個程式。

  執行多個文件編譯而來的程式

  此外,在使用csc.exe編譯多個文件時,還可以使用通配符"*"表示編譯當前目錄下的所有指定尾碼名文件。如:csc *.cs表示編譯當前目錄下所有.cs文件。

六、使用C#響應文件

  至此,我們已經可以使用csc.exe編譯多個源文件的C#應用程式了。在編譯過程中,需要設置一些命令行選項以達到某種效果。當程式規模大到一定程度,就需要輸入很多的命令行選項,容易出錯且錄入工作量大。為了應對這一問題,C#有響應文件(response file,尾碼名為rsp)的概念。C#響應文件包含編譯一個或多個C#源文件時需要指定的命令行選項。

  編輯HelloWorld.rsp文件,將編譯源文件時需要用到的引入外部程式集、設置輸出程式的類型及名字等命令行選項寫在這個文件里,並將這個響應文件和源程式文件放在同一目錄下。csc.exe編譯時,輸入csc @HelloWorld.rsp就可以按照設置的命令行選項編譯這個C#源程式了。

  編輯響應文件

  成功通過響應文件編譯源程式

  程式可以正常運行。

  通過響應文件編譯的程式可以正常運行

  這裡有幾點需要註意的地方:①寫在後面的命令行選項或響應文件的內容會覆蓋掉前面的命令行選項或響應文件的內容(以後規定的為準!) ②/reference具有累加性,最終程式引用的外部程式集為各個地方(命令行選項和響應文件)規定的程式集的並集

七、關於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幫我們自動引入的),它們將會被編譯器忽略,所以不會影響程式的質量。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 假如有100個知識點, 你會90個,你不主動說,面試官問了 你不會的10個裡的7個,其他的3個是你會的90個裡的 那麼你的得分是30分。 假如你會30個,你主動說了你會的7個,面試官問了你3個,其中有2個是你不會的那70個裡的,那麼你的得分是80分。 所以面試的時候要主動說出你擅長的領域,你會的東西 ...
  • 上次寫的隨筆,簡單21點紙牌小游戲,當窗體大小改變時,紙牌畫面會出現不顯示的問題,因為每一張牌都是用GDI+的方法,從圖片中剪裁下來的,沒有用到vs提供的控制項,如PictureBox控制項,這就需要自己在窗體的Paint事件中來重新繪製圖片,這樣在窗體大小改變時,就能夠正常顯示紙牌圖片了,代碼中紙牌父 ...
  • GraphQL 既是一種用於 API 的查詢語言也是一個滿足你數據查詢的運行時。 GraphQL來自Facebook,它於2012年開始開發,2015年開源。 GraphQL與編程語言無關,可以使用很多種語言/框架來構建Graph 伺服器,包括.NET Core。 像Github,Pinterest ...
  • 前一篇文章記錄了簡單的多線程編程的幾種方式,但是在實際的項目中,也需要等待多線程執行完成之後再執行的方法,這個就叫做多線程的同步,或者,由於多個線程對同一對象的同時操作造成數據錯亂,需要線程安全。這篇文章主要記錄多線程的同步非同步如何實現線程安全的幾種方式的筆記,如有錯誤,請大神不吝賜教。 因為代碼里 ...
  • 官方教程 安裝linux https://www.cnblogs.com/LittleFeiHu/p/9749455.html 第一步 :選擇和你本機適用的Linux版本,我這裡用的是18.04. 第二步 :註冊秘鑰,產品倉儲,以及安裝依賴項,每台機器只需要註冊一次, 第三步:安裝.net core ...
  • 1. 2.重啟電腦 3.在winstore下載和安裝 ubuntu 4.查看當前win10子系統的linux版本 lsb_release -a 5.設置root賬號密碼, 在終端輸入命令 sudo passwd, 然後輸入當前用戶的密碼, enter,終端會提示我們輸入新的密碼並確認, 此時的密碼 ...
  • 原文地址:https://www.cnblogs.com/szlblog/p/9045209.html AspNetCore 使用Redis實現分散式緩存 上一篇講到了,Core的內置緩存:IMemoryCache,以及緩存的基礎概念。本篇會進行一些概念上的補充。 本篇我們記錄的內容是怎麼在Core ...
  • 美國封殺中興通訊確實令人措手不及。但是除了慷慨陳詞和向國家伸手要錢以外,更不能頭疼醫頭、腳疼醫腳,而應該有一個巨集觀的思考。中興事件絕不是一個缺芯的問題,而是基礎軟硬體的缺失,是生態的不健全。 作者:劉學習 中國缺少自己的中國芯,沒有自己的操作系統!倪光南院士在幾十年前就曾大聲疾呼,並因此與聯想的掌門 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...