vscode怎么編寫和調(diào)試.net項(xiàng)目

vscode怎么編寫和調(diào)試.net項(xiàng)目

安裝插件

使用vscode編寫dotnet core項(xiàng)目除了其 默認(rèn)的功能外,我推薦還要安裝一些非常有特色,并且有用的擴(kuò)展,正是因?yàn)閂SCode的插件機(jī)制,才讓它變得更加強(qiáng)大,滿足我們各式各樣的需求。

1、C#語言擴(kuò)展

這個(gè)是使用VSCode編寫C#代碼必須的,安裝之后在默認(rèn)打開.cs文件時(shí)還會(huì)自動(dòng)下載調(diào)試器等。

2、[C# xml注釋]

這個(gè)插件可以快速的幫你添加注釋,選擇安裝吧。

3、[C# Extensions]

這個(gè)插件,強(qiáng)烈推薦,可以幫你在建立文件的時(shí)候初始化文件內(nèi)容包括對(duì)應(yīng)的命名空間等。

還有一些其他輔助類的,比如EditorConfig,Guildes,One Dark Theme,Project Manager ,Setting Sync等。

新建多項(xiàng)目解決方案

打開命令行工具,在命令行工具中輸入:

$:>?dotnet?new?sln?-o?vscode_tutorial?//在當(dāng)前目錄下?創(chuàng)建名為vscode_tutorial

以上命令使用dotnet sdk,新建一個(gè)解決方案文件,你可以不用命令行手動(dòng)創(chuàng)建,但是使用dotnet new?可以更加方便的創(chuàng)建dotnet core相關(guān)的項(xiàng)目,如下圖所示:

vscode怎么編寫和調(diào)試.net項(xiàng)目

建完解決方案我們要來建立項(xiàng)目了,包括一個(gè)控制臺(tái)項(xiàng)目,一個(gè)類庫項(xiàng)目和一個(gè)單元測試項(xiàng)目。

首先建立一個(gè)公共的類庫項(xiàng)目用于存放我們的業(yè)務(wù)方法(假設(shè)我們在做一個(gè)真實(shí)的項(xiàng)目)(注意,這時(shí)已經(jīng)cd進(jìn)sln目錄里了)

$:>?dotnet?new?classlib?-o?VSCodeTutorial.Common?//在當(dāng)前目錄下新建類庫項(xiàng)目VSCodeTutorial.Common $:>?dotnet?sln?add?VSCodeTutorial.Common/VSCodeTutorial.Common.csproj?//將項(xiàng)目添加到解決方案中

通過同樣的方式,我們建立好控制臺(tái)項(xiàng)目和單元測試項(xiàng)目

$:>?dotnet?new?console?-o?VSCodeTutorial.ConsoleApp $:>?dotnet?sln?add?VSCodeTutorial.ConsoleApp/VSCodeTutorial.ConsoleApp.csproj $:>?dotnet?new?xunit?-o?VSCodeTutorial.UnitTest $:>?dotnet?sln?add?VSCodeTutorail.UnitTest/VSCodeTutorial.UnitTest.csproj

這里要注意控制的模板名稱叫console,而單元測試我們使用xunit。

這個(gè)時(shí)候我們的項(xiàng)目結(jié)構(gòu)已經(jīng)建立完成了,我們用VsCode來打開當(dāng)前目錄來看看完成的項(xiàng)目結(jié)構(gòu)吧,如下圖所示:

vscode怎么編寫和調(diào)試.net項(xiàng)目

添加項(xiàng)目間的依賴關(guān)系

使用VsCode打開項(xiàng)目文件VSCodeTutorial.ConsoleApp.csproj,在其中添加對(duì)Common項(xiàng)目的引用

<project> ??<propertygroup> ????<outputtype>Exe</outputtype> ????<targetframework>netcoreapp1.1</targetframework> ??</propertygroup> ?<!--添加項(xiàng)目引用--> ??<itemgroup> ????<projectreference></projectreference> ??</itemgroup></project>

同樣打開VSCodeTutorial.UnitTest.csproj項(xiàng)目文件,在其中添加對(duì)Common項(xiàng)目的引用

<project> ??<propertygroup> ????<targetframework>netcoreapp1.1</targetframework> ??</propertygroup><!--nuget 上的類庫引用--> ??<itemgroup> ????<packagereference></packagereference> ????<packagereference></packagereference> ????<packagereference></packagereference> ??</itemgroup><!--本地項(xiàng)目引用--> ?<itemgroup> ????<projectreference></projectreference> ??</itemgroup></project>

和上面的那個(gè)項(xiàng)目不同,這里有一些額外的依賴,這里可以剛好了解下,如果添加nuget中包的依賴,只需像上面一樣使用PackageReference并填入類庫名稱和版本號(hào)即可。

添加完依賴后,我們在根目錄下使用dotnet restore來初始化一下,也可以再用dotnet build命令來嘗試編譯一下。

項(xiàng)目依賴關(guān)系如圖2:

vscode怎么編寫和調(diào)試.net項(xiàng)目

開始編寫代碼

這個(gè)項(xiàng)目的整體需求:我需要打開一個(gè)控制臺(tái)程序,運(yùn)行時(shí)需要用戶輸入一個(gè)小于50的整數(shù),控制臺(tái)接收到這個(gè)數(shù)字后計(jì)算出這個(gè)數(shù)字的階乘,并把結(jié)果輸出到控制臺(tái)上。

經(jīng)過簡單的思考,我決定把階乘的實(shí)現(xiàn)放到Common項(xiàng)目中,并且對(duì)其進(jìn)行單元測試,測試的代碼則放到UnitTest項(xiàng)目中

vscode怎么編寫和調(diào)試.net項(xiàng)目

首先我們把之前生成的項(xiàng)目中不需要的文件給刪除掉VsCodeTutorial.Common中的Class1.cs和VSCodeTutorial.UnitTest中的UnitTest1.cs ,當(dāng)然你也可以留著。

第一步,我們在VsCodeTutorial.Common項(xiàng)目中新建文件MathHelper.cs并在文件中添加如下代碼,實(shí)現(xiàn)我們的階乘,代碼比較簡單就不詳述了。

namespace?VSCodeTutorial.Common{???? public?class?MathHelper ????{????????///?<summary> ????????///?階乘,本例中暫不考慮?溢出的問題哦?Factorial(n)?=?n*(n-1)*(n-2)...*1; ????????///?</summary> ????????///?<param>輸入?yún)?shù)n ????????///?<returns></returns> ????????public?static?int?Factorial(int?n){????????????if(n?<p>第二步,我們要來測試這個(gè)代碼,看看是否達(dá)到了我們的目標(biāo),在VSCodeTutorial.UnitTest項(xiàng)目中新建文件MathHelpTest.cs向文件中添加測試Factorial函數(shù)的方法,如下所示:</p><pre class="brush:php;toolbar:false">using?System; using?VSCodeTutorial.Common; using?Xunit; namespace?VSCodeTutorial.UnitTest{???? public?class?MathHelperTest ????{ ?????????[Fact]???????? public?void?TestFactorial()????????{????????????//先測試一下邊界的情況 ????????????int?zero?=?0?;???????????? var?exception?=?Assert.Throws<argumentoutofrangeexception>(()?=&gt;?MathHelper.Factorial(zero));???????????? int?one?=?1;???????????? var?oneResult?=?MathHelper.Factorial(one); ????????????Assert.Equal(1,?oneResult);????????????//再測一下正常的情況 ????????????int?five?=?5;???????????? var?fiveResult?=?MathHelper.Factorial(five); ????????????Assert.Equal(5*4*3*2*1,?fiveResult);???????????? int?ten?=?10;???????????? var?tenResult?=?MathHelper.Factorial(ten); ????????????Assert.Equal(10*9*8*7*6*5*4*3*2*1,?tenResult); ????????} ????} }</argumentoutofrangeexception>

使用命令行運(yùn)行單元測試

在使用配置VSCode之前 我還是建議大家先使用命令行來運(yùn)行一下單元測試,這有利于更好的理解配置內(nèi)容。

在根目錄下輸入命令:dotnet test ./VSCodeTutorial.UnitTest/VSCodeTutorial.UnitTest.csproj?查看運(yùn)行結(jié)果:

vscode怎么編寫和調(diào)試.net項(xiàng)目

很差勁會(huì)出現(xiàn)編碼錯(cuò)誤,而且這個(gè)錯(cuò)誤暫時(shí)還沒有辦法解決..但是我猜單元測試通過了,這個(gè)問題相信在后續(xù)的版本中肯定會(huì)得到解決,事實(shí)上在Console項(xiàng)目中是可以解決輸出亂碼問題的。不過可喜的是在VSCode中運(yùn)行單元測試是沒有亂碼的問題的。

使用VSCode 運(yùn)行單元測試

首先當(dāng)你打開項(xiàng)目的時(shí)候,VSCode 可能已經(jīng)建議你配置一下相關(guān)的內(nèi)容,如下圖所示:

vscode怎么編寫和調(diào)試.net項(xiàng)目

選擇Yes, 會(huì)幫你新建這個(gè)一個(gè)目錄和兩個(gè)文件,luanch.json是用來執(zhí)行調(diào)試程序的配置,而tasks.json則是配置各種任務(wù)的,其中運(yùn)行單元測試就是一種任務(wù)。

vscode怎么編寫和調(diào)試.net項(xiàng)目

首先我們打開tasks.json?,默認(rèn)已經(jīng)添加好了一個(gè)任務(wù),如下所示:

{???? "version":?"0.1.0",???? "command":?"dotnet",?//全局命令,即所有的任務(wù)都使用這個(gè)命令,也可以在各個(gè)任務(wù)中設(shè)置???? "isShellCommand":?true,???? "args":?[],???? "tasks":?[???????? {???????????? "taskName":?"build",?//任務(wù)名稱?當(dāng)設(shè)置了主的command?之后這個(gè)taskName也會(huì)作為一個(gè)命令參數(shù)???????????? "args":?[???????????????? "${workspaceRoot}VSCodeTutorial.ConsoleAppVSCodeTutorial.ConsoleApp.csproj" ????????????],???????????? "isBuildCommand":?true,? //一個(gè)解決方案只能設(shè)置一個(gè)編譯任務(wù),多設(shè)置了也是白搭,當(dāng)然也能執(zhí)行,只是不能利用快捷方式運(yùn)行了??????????? "problemMatcher":?"$msCompile"//C#項(xiàng)目的problemMatcher???????? }???? ]}

默認(rèn)使用了全局命令行,這樣可以在任務(wù)中省去配置dotnet命令,但是如果你的解決方案中包括多個(gè)項(xiàng)目需要不同的命令行編譯方式,如果前端網(wǎng)站使用grunt打包資源,那么頂部應(yīng)該留空,而在各個(gè)子任務(wù)中配置command。

還有如果存在多個(gè)編譯項(xiàng)目時(shí)(如客戶端和服務(wù)端在一個(gè)解決方案時(shí)),也應(yīng)該把command配置在子任務(wù)中,并設(shè)置個(gè)性化的taskName以便區(qū)別,所以我推薦把command設(shè)置在任務(wù)中,下面我們修改一下以上代碼,并添加一個(gè)運(yùn)行單元測試的人。

{???? "version":?"0.1.0",???? "isShellCommand":?true,???? "args":?[],???? "tasks":?[???????? {??????????? "taskName":?"build_console",???????????? "command":"dotnet" ????????????"args":?[???????????????? "build",?//組成dotnet?build???????????????? //設(shè)置需要編譯的項(xiàng)目,如果存在多個(gè)啟動(dòng)項(xiàng)目可以設(shè)置成解決方案文件(.sln),這里只有一個(gè)項(xiàng)目所以設(shè)置運(yùn)行項(xiàng)目也可以???????????????? "${workspaceRoot}VSCodeTutorial.ConsoleAppVSCodeTutorial.ConsoleApp.csproj" ????????????],???????????? "isBuildCommand":?true,?//設(shè)置是否編譯項(xiàng)目???????????? "problemMatcher":?"$msCompile" ????????},???????? {???????????? "taskName":?"UnitTest",???????????? "command":"dotnet",???????????? "args":?[???????????????? "test",//組成dotnet?test?命令???????????????? "${workspaceRoot}VSCodeTutorial.UnitTestVSCodeTutorial.UnitTest.csproj" ????????????],???????????? "isTestCommand":?true,//設(shè)置為單元測試項(xiàng)目??????????? "problemMatcher":?"$msCompile" ????????}???? ]}

上面的代碼中,我將command命令移到了任務(wù)中,并給每個(gè)任務(wù)起了一個(gè)好識(shí)別的名字,現(xiàn)在這里一個(gè)有2個(gè)任務(wù)了

第一個(gè)任務(wù)build_console?運(yùn)行時(shí) 會(huì)編譯VSCodeTutorial.ConsoleApp項(xiàng)目及其依賴的項(xiàng)目

第二個(gè)任務(wù)UnitTest則是單元測試項(xiàng)目,運(yùn)行dotnet test命令,這里有個(gè)特殊的設(shè)置就是”isTestCommand”: true?標(biāo)識(shí)為測試項(xiàng)目后可以通過快捷方式運(yùn)行該命令

任務(wù)建好了,我們來運(yùn)行任務(wù)把,windows按下 ctrl+shift+p,在彈出的對(duì)話框中輸入:task 過濾命令可以得到以下的選項(xiàng)

vscode怎么編寫和調(diào)試.net項(xiàng)目

選擇任務(wù):運(yùn)行測試任務(wù)?這條來運(yùn)行我們之前編寫好的單元測試項(xiàng)目,可以看到運(yùn)行成功的情況,如下圖所示:

vscode怎么編寫和調(diào)試.net項(xiàng)目

這里中文顯示正常,沒有亂碼哦,但是我不知道是什么原因..就是這么神奇

對(duì)于經(jīng)常執(zhí)行的任務(wù),可以通過設(shè)置鍵盤快捷方式來方便調(diào)用,可以看到我分別設(shè)置了ctrl+shift+t 運(yùn)行測試任務(wù)ctrl+shift+b 運(yùn)行編譯任務(wù),ctrl+shift+r 啟動(dòng)選擇任務(wù),大家可以根據(jù)自己的喜好來設(shè)置。

開始編寫控制臺(tái)代碼

打開VSCodeTutorial.ConsoleApp項(xiàng)目中的Program.cs文件,修改其中的代碼,如下所示:

using?System; using?VSCodeTutorial.Common; namespace?VSCodeTutorial.ConsoleApp{???? class?Program ????{???????? static?void?Main(string[]?args)????????{???????????? while(true) ????????????{ ????????????????Console.WriteLine("請(qǐng)輸入一個(gè)小于10的數(shù)字,回車結(jié)束:");???????????????? string?input_str?=?Console.ReadLine();???????????????? if(int.TryParse(input_str?,out?var?input_int)) ????????????????{???????????????????? if(input_int&gt;0?&amp;&amp;?input_int<p>代碼比較 簡單,就不做解釋了,我們直接來看運(yùn)行的結(jié)果,這里順便提一下啊,在我們之前做的眾多工作之后,我們這里編寫代碼有美美噠的智能提示哦,如下圖所示:</p><p><img src="https://img.php.cn/upload/image/931/133/437/1576466180622298.png" title="1576466180622298.png" alt="27ab0b7aeaa9f9fedc9cdaa0e017ea0.png"></p><p>好,再根目錄下輸入以下命令運(yùn)行ConsoleApp</p><pre class="brush:php;toolbar:false">$:&gt;?dotnet?run?-p?./VSCodeTutorial.ConsoleApp/VSCodeTutorial.ConsoleApp.csproj

也可以在VSCodeTutorial.ConsoleApp?目錄下直接運(yùn)行dotnet run?命令即可.

結(jié)果運(yùn)行還是亂碼中,但是這次我們有辦法解決,我們在控制臺(tái)代碼中添加一句代碼即可onsole.OutputEncoding = Encoding.UTF8

using?System; using?System.Text; using?VSCodeTutorial.Common;namespace?VSCodeTutorial.ConsoleApp{???? class?Program ????{???????? static?void?Main(string[]?args)????????{ ????????????Console.OutputEncoding?=?Encoding.UTF8;?//?設(shè)置控制臺(tái)編碼 ????????????while(true) ????????????{ ????????????????Console.WriteLine("請(qǐng)輸入一個(gè)小于10的數(shù)字,回車結(jié)束:");???????????????? string?input_str?=?Console.ReadLine();???????????????? if(int.TryParse(input_str?,out?var?input_int)) ????????????????{???????????????????? if(input_int&gt;0?&amp;&amp;?input_int<p>使用dotnet build編譯后,再次運(yùn)行Console項(xiàng)目看到了我們期望的界面</p><p><img src="https://img.php.cn/upload/image/349/842/176/1576466289717477.png" title="1576466289717477.png" alt="b76cb78aa94941a9cbf2daf55b797c8.png"></p><p>程序運(yùn)行正確,當(dāng)然了,我們都跑過單元測試了不是。。</p><p><strong>開始調(diào)試程序</strong></p><p>如下圖提示操作:</p><p><img src="https://img.php.cn/upload/image/490/209/624/1576466328963482.png" title="1576466328963482.png" alt="344a8ded85295ecd8f67bc8cd2f01ab.png"></p><p>終于輪到我們之前生成的launch.json文件出場了,先來看下它的代碼,代碼中已經(jīng)添加了配置的說明</p><pre class="brush:php;toolbar:false">{???? "version":?"0.2.0",???? "configurations":?[???????? {???????????? "name":?".NET?Core?Launch?(console)",?//配置名稱?可以改成更好識(shí)別的名字???????????? "type":?"coreclr",?//?.net?core類型的調(diào)試???????????? "request":?"launch",?//調(diào)試方式?不用改???????????? "preLaunchTask":?"build",?//?前置任務(wù),這里是編譯,但是默認(rèn)的編譯任務(wù),已經(jīng)被我改了名字了,所以這里要改一下哦????????????"program":?"${workspaceRoot}VSCodeTutorial.ConsoleAppbinDebugnetcoreapp1.1VSCodeTutorial.ConsoleApp.dll",?//需要調(diào)試的DLL的位置? "args":?[],?//額外的參數(shù)???????????? "cwd":?"${workspaceRoot}VSCodeTutorial.ConsoleApp",?//工作目錄???????????? "console":?"internalConsole",?//控制臺(tái)模式,這里是內(nèi)嵌控制臺(tái),一會(huì)要改成外置的,不然沒法交互輸入???????????? "stopAtEntry":?false,???????????? "internalConsoleOptions":?"openOnSessionStart" ????????},???????? {???????????? "name":?".NET?Core?Attach",?//名稱???????????? "type":?"coreclr",?//類型???????????? "request":?"attach",?//使用附加的方式???????????? "processId":?"${command:pickProcess}"?//附加的進(jìn)程ID???????? }???? ]}

根據(jù)實(shí)際情況,需要對(duì)上面的配置進(jìn)行以下變更,變更的部分已經(jīng)添加了注釋,附加調(diào)試不是本文的重點(diǎn),就不改了

{???? "version":?"0.2.0",???? "configurations":?[ ????????{???????????? ????????"name":?"調(diào)試ConsoleApp",?//修改下命令???????????? ????????"type":?"coreclr",???????????? ????????"request":?"launch",???????????? ????????"preLaunchTask":?"build_console",?//修改前置任務(wù)名和task.json中配置一致???????????? ????????"program":?"${workspaceRoot}VSCodeTutorial.ConsoleAppbinDebugnetcoreapp1.1 ????????VSCodeTutorial.ConsoleApp.dll",???????????? ????????"args":?[],???????????? ????????"cwd":?"${workspaceRoot}VSCodeTutorial.ConsoleApp",???????????? ????????"externalConsole":true,?//使用外置的控制臺(tái)???????????? ????????"stopAtEntry":?false,???????????? ????????"internalConsoleOptions":?"openOnSessionStart" ????????}, ????????{???????????? ????????"name":?".NET?Core?Attach",???????????? ????????"type":?"coreclr",???????????? ????????"request":?"attach",???????????? ????????"processId":?"${command:pickProcess}" ????????} ????] }

修改完成后,我們點(diǎn)擊運(yùn)行按鈕可以開始調(diào)試了,調(diào)試的方式和使用VS是一致的,快捷鍵為F5 F10 F11

vscode怎么編寫和調(diào)試.net項(xiàng)目

完成!

相關(guān)文章教程推薦:vscode教程

以上就是

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊14 分享