深入了解使用 Visual Studio Code 进行 C# 开发





5.00/5 (9投票s)
如果有一天你觉得 ReSharper 的自动补全、智能感知、内置调试器和其他现代编程增强功能让开发变得无聊,发展太快以至于过程变得没有吸引力,会怎么样?
引言
如今,编写 .NET C# 应用程序已成为一个例行过程,这与编程的起源——个人爱好——有着显著的区别。对于拥有 12 年以上专业 C# .NET 应用程序开发经验的技术专家来说,利用所有现代代码编写增强功能的力量,例如 ReSharper 自动补全、调试器、智能感知等——编码变成了一种毫无意义的例行公事。这时,有时会产生一种愿望,希望在没有所有使软件开发成为自动化行业而不是个人爱好的东西的情况下编写一段代码。在 DOS 控制台中记录消息,牢记类型、局部变量、函数定义,通过启动应用程序测试每个函数——这就是本文的重点。
背景
使用现代软件开发工具编写代码,感觉就像代码自己会写一样。在某些时候,使用原始、原始的技术进行简单的编码可能会很困难。
Using the Code
不可否认,使用现代软件开发工具有其宝贵的优点和好处。总而言之:自动补全、调试器和智能感知使代码编写过程非常简单直接。然而,本文并非关于这些现代工具的优缺点。本文简要介绍了如何使用原始的 DOS 命令、引用项目、使用 CSC 编译工具和 Visual Studio Code(与任何其他文本编辑器相同)来编写 C# 库和控制台应用程序。
为什么选择 Visual Studio Code?因为它显示了内置的项目浏览器,其中包含项目结构,简化了对项目文件的访问;它还提供了代码编辑器内的简单终端和控制台部分。你可以在同一个应用程序窗口中编写代码和执行命令。这在大显示器上非常方便。它没有 C# 开发人员通常拥有的增强功能,例如拼写检查、智能感知、内置可附加调试器、自动补全等。
要创建一个最简单的 .NET C# 应用程序,所有需要的只是一份包含可编译 C# 代码的文本文件以及用于将代码编译成二进制文件的 CSC 工具。CSC 是处理文本 C# 代码并生成二进制代码(可执行文件或库)的编译器。MSBuild 是一个实用程序,它允许为 CSC 编译器创建可读的配置。
为简单起见,我将创建一个类库和一个使用(引用)该库的控制台应用程序。.NET Framework 3.5 是运行时。
启动 Visual Studio Code,按 Ctrl+` 打开终端。
mkdir PizzaLib
cd PizzaLib
mkdir .vscode
cd .vscode
type nul > tasks.json
cd ..
type nul > PizzaShop.cs
type nul > DeliveryService.cs
mkdir bin
配置项目生成过程以交付编译后的 DLL 文件
在 Visual Studio Code 中打开这个新项目(使用快捷键 Ctrl+K Ctrl+O)。
然后双击 /.vscode/tasks.json 文件并配置生成过程
{
"version": "2.0.0",
"tasks": [
{
"label": "pizzalibbuild",
"command": "C:\\Windows\\Microsoft.NET\\Framework\\v3.5\\CSC.exe",
"type":"shell",
"args": [
"/t:library",
"/out:bin/PizzaLib.dll",
"*.cs"
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
tasks.json 文件是 Visual Studio Code 用于在交付最终 DLL 文件或可执行文件之前执行翻译、编译、生成、汇编操作的配置文件。该文件中的每个 Task 节点都定义了一个单独的命令,例如 shell(可以是 bash 脚本、CMD、PowerShell)或进程,用于执行命令时提供的参数列表。配置选项:group -> kind -> "build" 将此任务定义为生成项目的默认任务(当按下 **Ctrl+Shift+B** 快捷键时)。
库代码
示例“PizzaLib.dll”库负责烹饪披萨并将其交付给客户。应定义两个类:PizzaShop.cs 和 DeliveryService.cs——一个用于订购和烹饪披萨,另一个用于将披萨交付给客户。
PizzaShop.cs
using System;
namespace PizzaLib
{
public class PizzaShop
{
public void OrderPizza()
{
Console.WriteLine("Pizza Mozzarella with cheese. Your order is being processed.");
}
public void CookPizza()
{
Console.WriteLine("Cooking delicious pizza...");
}
}
}
DeliveryService.cs
using System;
namespace PizzaLib
{
public class DeliveryService
{
public void Deliver()
{
Console.WriteLine("Delivering to customer.");
}
}
}
编写完代码后,就可以配置生成任务了。按 **Ctrl+Shift+B** 来生成库。任务完成,库已编译,可以被另一个应用程序(在本例中是控制台应用程序)引用。
使用 PizzaLib 订购和配送披萨的控制台应用程序
打开另一个 Visual Studio Code 实例,为控制台应用程序制作类似的结构。
mkdir PizzaConsoleTest
cd PizzaConsoleTest
mkdir .vscode
cd .vscode
type nul > tasks.json
type nul > launch.json
cd ..
type nul > PizzaConsoleTest.cs
mkdir bin
cd ..
使用快捷键 Ctrl+K Ctrl+O 在 Visual Studio Code 中打开该目录。
请按照以下指南配置生成(tasks.json)和启动进程(launch.json)
tasks.json
{
"version": "2.0.0",
"tasks": [
{
"label": "pizzaconsoletestbuild",
"command": "C:\\Windows\\Microsoft.NET\\Framework\\v3.5\\CSC.exe",
"type": "shell",
"args": [
"/r:\"../PizzaLib/bin/PizzaLib.dll\",\"../PizzaLib/bin/PizzaLib.dll\"",
"/out:bin/PizzaConsoleTest.exe",
"*.cs"
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
此文件与为 PizzaLib
项目配置的 tasks.json 基本相同,但是,请注意 /r
CSC 编译器选项如何定义引用的“PizzaLib.dll”库:/r:"../PizzaLib/bin/PizzaLib.dll","../PizzaLib/bin/PizzaLib.dll"
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "PizzaConsoleTestLauncher",
"type": "clr",
"request": "launch",
"preLaunchTask": "pizzaconsoletestbuild",
"program": "${workspaceFolder}/bin/PizzaConsoleTest.exe",
"args":[],
"console": "internalConsole",
"stopAtEntry": false,
"internalConsoleOptions": "openOnSessionStart"
}
]
}
launch.json 文件定义了 Visual Studio Code 用于调试或执行已编译项目的配置选项。此文件对于具有可执行输出的项目有效。它简单地指定了在执行最终文件及其可选参数之前应采取的操作。在此情况下,配置定义了一个名为“pizzaconsoletestbuild
”的生成任务,该任务将在启动最终编译后的可执行文件之前执行。
好的,让我们使用 PizzaShop
库来烹饪和配送美味的比萨。将代码添加到 PizzaConsoleTest.cs 应用程序文件中
using System;
using PizzaLib;
namespace PizzaConsoleTest
{
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Ordering Pizza with PizzaLib");
PizzaShop pizzaShop = new PizzaShop();
pizzaShop.OrderPizza();
pizzaShop.CookPizza();
DeliveryService deliveryService = new DeliveryService();
deliveryService.Deliver();
}
}
}
如果您仔细查看 tasks.json 文件,CSC 编译器已配置为使用引用的库 PizzaLib.dll,而其余的事情就是将该库复制到控制台应用程序的“bin”文件夹中,以便在控制台应用程序执行时使其可用。
copy /Y "..\..\PizzaLib\bin\PizzaLib.dll" "bin\PizzaLib.dll"
如果一切配置正确,只需按 **Ctrl+F5** 即可执行控制台应用程序,结果如下:
-------------------------------------------------------------------
You may only use the Microsoft .NET Core Debugger (vsdbg) with
Visual Studio Code, Visual Studio or Visual Studio for Mac software
to help you develop and test your applications.
-------------------------------------------------------------------
Ordering Pizza with PizzaLib
Pizza Mozzarella with cheese. Your order is being processed.
Cooking delicious pizza...
Delivering to customer.
The program '[7152] PizzaConsoleTest.exe' has exited with code 0 (0x0).
关注点
由于配置困难和代码复杂性,命令行界面和简单的文本编辑器将使开发多模块、分布式 Web 应用程序变得极其困难。这种简单的实践只是出于兴趣。复杂的开发环境,拥有现代编码增强功能,为构建庞大的系统提供了更多的能力和灵活性。
- 有关使用 Visual Studio Code 进行 C# 开发的更多信息,请阅读本文。
- Visual Studio Code - 开源,GitHub 上
- MSDN 关于 C# 编译器 - CSC 的文章
- C# 命令行编译器详解 - CSC 可用选项(配置参数)
历史
- 2020 年 3 月 3 日:初始版本