.NET Console 项目详解

2 阅读2分钟

.NET Console(控制台应用)是最基础的 .NET 项目类型,无GUI、基于命令行交互,适合工具脚本、后台服务原型、学习调试、批量处理程序。

支持 .NET Framework / .NET Core / .NET 5+(现在主流是 .NET 6/7/8,顶级语句模板是默认模板)

一、两种项目模板对比

模板1:顶级语句(.NET 6+ 默认,推荐新手)

自动隐藏 Program 类和 Main 方法,代码简洁,不需要手动写入口。

// Program.cs
Console.WriteLine("Hello .NET Console");
string input = Console.ReadLine();
Console.WriteLine($"你输入:{input}");

本质:编译器自动生成 Program 类和 Main 入口,只是简化写法。

模板2:传统完整模板(.NET 5及以前,老项目、需要多入口时用)

显式 Program + Main,适合理解底层入口机制

using System;

namespace ConsoleDemo
{
    class Program
    {
        // 程序入口,Main 必须是 static
        static void Main(string[] args)
        {
            Console.WriteLine("传统模板");
        }
    }
}
  • string[] args:命令行启动参数,程序启动时从命令行传入> > 例如:ConsoleDemo.exe -name=test,args数组拿到"-name=test"

二、创建项目(CLI命令,跨平台 Windows/Linux/Mac)

前提:安装对应版本 .NET SDK

# 1. 创建控制台项目
dotnet new console -n ConsoleDemo

# 2. 进入项目目录
cd ConsoleDemo

# 3. 编译并运行
dotnet run

# 4. 发布(生成可独立运行程序)
# 依赖框架发布(体积小,目标机器需要装.NET运行时)
dotnet publish -c Release

# 独立发布(自带运行时,目标机器不用装.NET)
dotnet publish -c Release --self-contained true -r win-x64

项目文件 ConsoleDemo.csproj 核心说明

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType> <!-- Exe = 可执行程序;Library是类库 -->
    <TargetFramework>net8.0</TargetFramework> <!-- 目标框架 -->
    <ImplicitUsings>enable</ImplicitUsings> <!-- 隐式using,不用写using System等 -->
    <Nullable>enable</Nullable> <!-- 可空引用类型 -->
  </PropertyGroup>
</Project>
  • Sdk="Microsoft.NET.Sdk":.NET 新式SDK风格(区别于老 .NET Framework 的 Sdk=“Microsoft.NET.Sdk.Web” 等)
  • OutputType=Exe:代表这是可执行程序,有入口点;类库是 Library,不能直接运行

三、控制台核心API(System.Console)

方法作用
Console.WriteLine()输出一行,自动换行
Console.Write()输出,不换行
Console.ReadLine()读取一行用户输入,返回string;回车结束
Console.ReadKey()读取单个按键,不等待回车
Console.Clear()清空控制台窗口
Console.ForegroundColor设置文字颜色
Console.BackgroundColor设置背景色
Console.Exit(0)退出程序;0代表正常退出,非0代表异常

示例:颜色+按键

Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("绿色文字");
Console.ResetColor(); //恢复默认颜色
Console.WriteLine("按任意键退出");
Console.ReadKey();

四、命令行参数 args 使用

// 顶级语句模板直接使用 args
if(args.Length > 0)
{
    Console.WriteLine($"收到参数:{args[0]}");
}
else
{
    Console.WriteLine("没有传入参数");
}

运行方式:

dotnet run -- hello 123
# args = ["hello", "123"]

-- 是分隔符,告诉dotnet run后面的参数传给你的程序,不是dotnet命令本身。

五、控制台项目生命周期

  1. 程序启动 → CLR加载程序集
  2. 执行入口方法(Main / 顶级语句)
  3. 顺序执行代码;遇到异步代码会有差异
  4. 所有主线代码执行完毕,程序退出> > ⚠️ 控制台默认:主线程执行完就退出;如果开后台任务,需要手动阻塞(Console.ReadLine() / Wait())

异步 Main(非常常用)

很多场景需要调用异步方法,顶级语句天然支持await;传统写法可以写 static async Task Main

// 顶级语句
await Task.Delay(1000);
Console.WriteLine("等待1秒完成");

传统模板异步入口:

static async Task Main(string[] args)
{
    await Task.Delay(1000);
}

六、依赖管理(NuGet包)

控制台项目可以像Web项目一样引入NuGet

# 添加包
dotnet add package Newtonsoft.Json

引入后直接在代码使用,csproj自动增加PackageReference节点。

七、控制台常见使用场景

  1. 批量数据处理工具(文件导入导出、ETL小脚本)
  2. 单元测试/原型验证(快速测试C#代码、算法)
  3. Windows/Linux 定时任务脚本(配合计划任务、Crontab)
  4. 简易客户端,调用WebApi、数据库
  5. 学习C#基础,不用理解GUI复杂机制

八、控制台项目局限性

  1. 没有界面,只能文本交互
  2. 默认没有内置日志框架(需要引入Serilog/NLog)
  3. 不适合长时间后台常驻服务(长时间后台优先用 Worker Service)> > 👉 区分:Console 临时工具;Worker Service 是 .NET 官方后台服务模板(Windows服务/Linux守护进程)

九、常见坑

  1. 中文乱码:Windows控制台默认GBK,.NET默认UTF8。”` Console.OutputEncoding = System.Text.Encoding.UTF8; Console.InputEncoding = System.Text.Encoding.UTF8;
  2. 异步代码直接await,主线程跑完程序直接退出,还没等异步任务完成。
  3. ReadLine() 输入null:控制台被重定向输入时会出现。
  4. 发布:区分框架依赖和独立发布,部署时容易忘记安装运行时。