.NET 10 File-Based Apps:一个 .cs 文件搞定一切,C# 终于也能像 Python 一样写脚本了!

发布时间:2026/7/22 11:38:55

.NET 10 File-Based Apps:一个 .cs 文件搞定一切,C# 终于也能像 Python 一样写脚本了!
目录引言告别 .csprojC# 也能单文件即运行一、什么是 File-Based Apps核心优势二、环境准备三、快速上手5 分钟写出第一个 File-Based App3.1 最简单的 Hello World3.2 引用 NuGet 包#:package 指令3.3 指定 SDK#:sdk 指令3.4 设置 MSBuild 属性#:property 指令3.5 引用其他项目#:project 指令四、完整的 CLI 命令支持运行应用构建与清理发布与打包依赖恢复五、Native AOT默认开启的高性能发布六、用户机密User Secrets七、Unix 系统上的 Shebang 支持八、Launch Profile 配置九、目录组织最佳实践❌ 不推荐✅ 推荐十、实战场景File-Based Apps 能做什么场景 1快速原型验证场景 2CLI 工具脚本场景 3数据迁移/ETL 脚本场景 4定时任务/自动化脚本十一、File-Based Apps vs 传统 .csproj 项目十二、从 File-Based App 到完整项目十三、写在最后参考资源引言告别 .csprojC# 也能单文件即运行还记得用 Python 写脚本时的那种爽快感吗一个.py文件直接python hello.py就能跑。而 C# 开发者呢哪怕只是想写个Hello World也得先dotnet new console生成一堆项目文件然后才能编译运行。这种仪式感在 .NET 10 中终于成为历史。.NET 10 引入了一个重磅新特性——File-Based Apps文件级应用。它允许你仅用一个.cs文件无需任何.csproj项目文件就能直接编译、运行、甚至发布为独立可执行文件。C# 从此真正具备了脚本语言的开发体验同时保留了编译型语言的性能优势。一、什么是 File-Based AppsFile-Based Apps 是 .NET 10 SDK 引入的一项创新功能允许开发者从单个 C# 源文件构建、运行和发布 .NET 应用程序无需创建传统的项目文件.csproj。.NET SDK 会自动根据源文件顶部的#:指令生成必要的项目配置为脚本、工具和小型应用提供了一种轻量级的替代方案。核心优势特性说明零配置无需.csproj文件一个.cs文件即可运行自包含配置内嵌在源文件中文件即项目Native AOT 默认启用发布时自动生成本地 Ahead-of-Time 编译的可执行文件自动打包为 .NET 工具支持dotnet pack直接打包为全局工具平滑升级可随时通过dotnet project convert转换为完整项目二、环境准备要使用 File-Based Apps你需要.NET 10 SDK 或更高版本任意文本编辑器VS Code、Cursor、记事本均可C# 扩展推荐用于 IntelliSense 支持验证 SDK 版本dotnet --version # 输出应为 10.0 或更高三、快速上手5 分钟写出第一个 File-Based App3.1 最简单的 Hello World创建一个文件hello.csConsole.WriteLine(Hello, File-Based App!);直接运行dotnet run hello.cs或者使用更简洁的语法dotnet hello.cs没错就这么简单没有dotnet new没有.csproj一个文件直接跑。3.2 引用 NuGet 包#:package 指令File-Based Apps 使用#:前缀的指令来配置构建。最常用的就是#:package用于引用 NuGet 包。创建一个sqlite-demo.cs#:package Microsoft.Data.SQLite8.0.0 usingMicrosoft.Data.Sqlite; var connectionString Data Source:memory:; usingvar connection newSqliteConnection(connectionString); connection.Open(); var command connection.CreateCommand(); command.CommandText CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT); INSERT INTO users (name) VALUES (山友); SELECT * FROM users;; usingvar reader command.ExecuteReader(); while(reader.Read()) { Console.WriteLine($ID: {reader.GetInt32(0)}, Name: {reader.GetString(1)}); }运行dotnet run sqlite-demo.cs输出ID: 1, Name: 山友版本控制技巧#:package Newtonsoft.Json— 省略版本号需配合 Central Package Management#:package Serilog3.1.1— 指定精确版本#:package Spectre.Console*— 使用最新版本3.3 指定 SDK#:sdk 指令默认使用Microsoft.NET.Sdk但你可以轻松切换为 Web SDK 或 Aspire SDK#:sdk Microsoft.NET.Sdk.Web #:package Swashbuckle.AspNetCore var builder WebApplication.CreateBuilder(args); var app builder.Build(); app.MapGet(/,()Hello from File-Based Web App!); app.MapGet(/api/health,()new{ status ok, timestamp DateTime.UtcNow }); app.Run();运行dotnet run webapi.cs使用Microsoft.NET.Sdk.Web时会自动包含同目录下的*.json配置文件如appsettings.json。3.4 设置 MSBuild 属性#:property 指令#:property TargetFrameworknet10.0 #:property PublishAotfalse #:property LogLevel$([MSBuild]::ValueOrDefault($(LOG_LEVEL), Information)) Console.WriteLine($Current Log Level: {Environment.GetEnvironmentVariable(LOG_LEVEL)??Information});#:property支持完整的 MSBuild 属性表达式包括环境变量读取、条件表达式等。3.5 引用其他项目#:project 指令#:project ../SharedLibrary/SharedLibrary.csproj usingSharedLibrary; Console.WriteLine(Helper.GetMessage());四、完整的 CLI 命令支持File-Based Apps 并非玩具功能它拥有完整的 CLI 支持运行应用# 标准方式 dotnet run --file app.cs # 简写推荐 dotnet run app.cs # 更简写当目录无 .csproj 时 dotnet app.cs # 传递参数 dotnet run app.cs -- arg1 arg2 # 从标准输入管道执行 echoConsole.WriteLine(hello from stdin!);| dotnet run -构建与清理# 编译 dotnet build app.cs # 清理构建产物 dotnet clean app.cs # 清理所有 file-based apps 缓存 dotnet clean file-based-apps发布与打包# 发布默认启用 Native AOT生成独立可执行文件 dotnet publish app.cs # 打包为 .NET 全局工具 dotnet pack app.cs # 转换为传统项目平滑升级路径 dotnet project convert app.cs依赖恢复# 显式恢复 NuGet 包 dotnet restore app.cs # 构建时自动恢复默认行为 dotnet build app.cs五、Native AOT默认开启的高性能发布File-Based Apps 的一个杀手锏特性是默认启用 Native AOT 发布。这意味着✅更快的启动速度— 无需 JIT 编译预热✅更小的内存占用— 无运行时依赖✅独立可执行文件— 单文件分发无需 .NET Runtime如果你不需要 AOT例如依赖反射较多的场景可以关闭#:property PublishAotfalse六、用户机密User SecretsFile-Based Apps 支持用户机密管理基于文件路径的哈希生成稳定的 Secrets ID# 设置机密 dotnet user-secrets setApiKeyyour-secret-value--file app.cs # 查看机密 dotnet user-secrets list --file app.cs七、Unix 系统上的 Shebang 支持在 Linux/macOS 上你可以让.cs文件像 Shell 脚本一样直接执行#!/usr/bin/env dotnet #:package Spectre.Console usingSpectre.Console; AnsiConsole.MarkupLine([green]Hello, World![/]);赋予执行权限并运行chmod x app.cs ./app.cs⚠️ 注意使用 Shebang 时文件必须使用LF换行符不能包含 BOM。八、Launch Profile 配置File-Based Apps 支持启动配置使用[应用名].run.json文件// app.run.json { profiles:{ http:{ commandName:Project, launchBrowser:true, applicationUrl:http://localhost:5000, environmentVariables:{ ASPNETCORE_ENVIRONMENT:Development } }, https:{ commandName:Project, launchBrowser:true, applicationUrl:https://localhost:5001;http://localhost:5000, environmentVariables:{ ASPNETCORE_ENVIRONMENT:Development } } } }运行指定 Profiledotnet run app.cs --launch-profile https九、目录组织最佳实践File-Based Apps 会继承父目录的Directory.Build.props、Directory.Packages.props等隐式构建文件。为了避免冲突❌ 不推荐 MyProject/ ├── MyProject.csproj ├── Program.cs └── scripts/ └── utility.cs // 会受到 MyProject.csproj 的隐式文件影响✅ 推荐 MyProject/ ├── MyProject.csproj └── Program.cs scripts/ └── utility.cs // 独立目录避免干扰十、实战场景File-Based Apps 能做什么场景 1快速原型验证#:package Newtonsoft.Json usingNewtonsoft.Json; var data new{ Name File-Based App, Version 1.0, Features new[]{Fast,Simple,Powerful}}; Console.WriteLine(JsonConvert.SerializeObject(data, Formatting.Indented));场景 2CLI 工具脚本#!/usr/bin/env dotnet #:package Spectre.Console #:package System.CommandLine usingSpectre.Console; usingSystem.CommandLine; // 构建一个功能完整的 CLI 工具 var rootCommand newRootCommand(文件批量重命名工具); var patternOption newOptionstring(--pattern,匹配模式); rootCommand.AddOption(patternOption); rootCommand.SetHandler((string pattern) { AnsiConsole.MarkupLine($[blue]正在处理匹配模式: {pattern}[/]); // 业务逻辑... }, patternOption); await rootCommand.InvokeAsync(args);场景 3数据迁移/ETL 脚本#:package Dapper #:package Microsoft.Data.SqlClient #:package CsvHelper usingDapper; usingMicrosoft.Data.SqlClient; usingCsvHelper; usingSystem.Globalization; // 从数据库读取写入 CSV — 一个文件搞定数据迁移场景 4定时任务/自动化脚本#:package Quartz // 使用 Quartz 构建定时任务部署为单文件后台服务十一、File-Based Apps vs 传统 .csproj 项目对比维度File-Based Apps传统 .csproj 项目项目文件❌ 不需要✅ 需要适合场景脚本、工具、原型、小型应用中大型应用、团队协作启动速度⚡ 更快AOT 默认 标准 JIT依赖管理#:指令内嵌PackageReference测试支持❌ 不支持dotnet test✅ 完整支持团队规模个人/小团队任意规模升级路径dotnet project convert本身就是完整项目关键洞察File-Based Apps 不是替代传统项目而是填补空白——在那些为了写个脚本还得建个项目的场景下它提供了恰到好处的轻量方案。十二、从 File-Based App 到完整项目当你的脚本逐渐复杂需要单元测试、CI/CD 或多项目结构时File-Based Apps 提供了平滑的升级路径dotnet project convert app.cs执行后SDK 会复制.cs文件到以应用名命名的目录根据#:指令生成等效的.csproj文件保留原始文件不变十三、写在最后.NET 10 的 File-Based Apps 是一个看似小巧、实则意义深远的特性。它标志着 .NET 平台在开发体验上的一次重要进化对初学者降低了 C# 的入门门槛一个文件就能开始编程对脚本开发者C# 终于可以像 Python 一样写脚本同时享受编译型语言的性能对运维/DevOps单文件可执行部署极简Native AOT 带来极致启动速度对原型开发快速验证想法需要时再平滑升级为完整项目C# 不再是重型企业级开发的专属标签它也能轻盈、敏捷、即刻运行。参考资源.NET 官方文档 - File-based appsGitHub - awesome-dotnet-fba — 精选 .NET 10 File-Based Apps 代码示例集.NET 10 File Based Apps Demonstration引入地址

相关新闻

从问题出发:重建统计思维,跨越理论与实践的鸿沟

从问题出发:重建统计思维,跨越理论与实践的鸿沟

2026/7/22 11:38:55

你有没有过这样的经历:翻开一本统计学教材,第一章是“基本概念”,第二章是“数据整理”,第三章是“概率基础”……然后你开始怀疑人生——我明明是想知道怎么分析这次营销活动的效果,怎么判断新药有没有用,…

TI Hercules安全MCU中CRC控制器与VIM中断管理器的实战配置与避坑指南

TI Hercules安全MCU中CRC控制器与VIM中断管理器的实战配置与避坑指南

2026/7/22 11:28:55

1. 项目概述与核心价值在嵌入式系统开发,尤其是汽车电子、工业控制这类对功能安全要求极高的领域,数据完整性和系统实时响应能力是两大基石。前者关乎系统能否“正确运行”,后者则决定了系统能否“及时响应”。我最近在基于TI Hercules系列安…

Keystone II DDR3初始化实战:读写均衡原理与调试指南

Keystone II DDR3初始化实战:读写均衡原理与调试指南

2026/7/22 11:28:55

1. 项目概述与核心挑战在嵌入式系统开发,尤其是基于德州仪器Keystone II这类高性能多核DSP的设计中,DDR3 SDRAM的稳定运行是项目成败的关键。它不仅是程序和数据的高速暂存地,更是决定系统整体带宽与响应速度的瓶颈。然而,从拿到一…

深度伪造检测技术:原理、实战与行业应用

深度伪造检测技术:原理、实战与行业应用

2026/7/22 12:38:58

1. 深度伪造技术现状与行业挑战 2023年第三季度的行业数据显示,全球每月新增的深度伪造视频数量已突破5万条,其中恶意伪造内容占比高达38%。这个现象背后是生成对抗网络(GAN)技术的平民化——现在只需一张RTX 3060显卡和开源代码库,普通人就能…

OpenClaw开源AI平台部署与优化指南

OpenClaw开源AI平台部署与优化指南

2026/7/22 12:38:58

1. OpenClaw项目概述与核心价值 OpenClaw是一个开源的AI开发与部署平台,它整合了模型训练、推理服务、消息代理和网关管理等核心功能。这个项目最吸引人的地方在于它提供了从本地开发到云端部署的全套工具链,特别适合需要快速搭建AI服务的中小团队和个人…

PRU-ICSS中断控制器:工业实时系统的硬件加速与寄存器精解

PRU-ICSS中断控制器:工业实时系统的硬件加速与寄存器精解

2026/7/22 12:38:58

1. 中断控制器在实时系统中的核心地位 在嵌入式系统,尤其是工业自动化、运动控制和工业以太网通信这类对实时性有严苛要求的领域,中断控制器(Interrupt Controller)的角色远不止是一个简单的“信号转发站”。它更像是一个高度专业…

ARM Cortex-M模拟比较器内部参考电压配置与实战应用

ARM Cortex-M模拟比较器内部参考电压配置与实战应用

2026/7/22 12:38:58

1. 项目概述与核心价值 在嵌入式硬件开发,尤其是基于ARM Cortex-M内核的微控制器项目中,模拟比较器(Analog Comparator)是一个既基础又强大的外设。它的核心任务很简单:实时比较两个模拟电压(VIN 和 VIN-&a…

Tiva QSSI SPI通信:帧格式与时钟模式配置详解

Tiva QSSI SPI通信:帧格式与时钟模式配置详解

2026/7/22 12:38:58

1. 项目概述:深入Tiva QSSI的SPI通信核心在嵌入式开发,尤其是基于德州仪器Tiva™系列微控制器的项目中,SPI(串行外设接口)几乎是连接外部传感器、存储器和显示模块的“标配”。但很多开发者,包括我早期&…

微任务、宏任务完整源码级拆解:Promise/async/await/setTimeout 坑合集

微任务、宏任务完整源码级拆解:Promise/async/await/setTimeout 坑合集

2026/7/22 12:28:57

Hi,我是前端人类学! JavaScript 的事件循环(Event Loop)是理解异步编程的基石,而微任务(Microtask)与宏任务(Macrotask)的调度机制,则是决定代码执行顺序的关…

微服务进阶:服务网格与Istio

微服务进阶:服务网格与Istio

2026/7/21 5:45:57

541|微服务进阶:服务网格与Istio 上篇文章我们聊了微服务的基本概念和拆分方法。 但微服务多了,问题也多了: 服务之间怎么通信? 怎么监控每个服务的调用链路? 熔断、限流、重试怎么做? 安全认证怎么统一? 以前这些都靠SDK库(比如Hystrix、Feign),每个服务都要集成…

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

2026/7/21 9:56:14

一、零售门店全域协同业务背景与行业痛点 1.1 门店超级终端设备矩阵(连锁便利店/商超标准配置) 自助收银Kiosk一体机:顾客结算、自助核销优惠券、商品素材预览;运营折叠平板:店长后台商品上新、图片录入、活动配置、…

噗叽短视频界面分析

噗叽短视频界面分析

2026/7/21 3:09:32

1 和小红书类似,可以采用类似判断方法------------其实他比小红书好判断,因为他没有图片,控件位置几乎是固定的,都不用判断------------2 因为他没有点赞按钮------------而且几乎所有控件位置都是完全一样的,所以我就…

设计EDA 首席专家 12 维度 JD(HR 仅高管 / HRD 使用)

设计EDA 首席专家 12 维度 JD(HR 仅高管 / HRD 使用)

2026/7/22 0:08:09

定位:公司 EDA 技术最高负责人、技术天花板、战略级专家、流片总兜底人 属于P9/Fellow/ 首席科学家级,不做日常执行,管方向、管架构、管风险、管突破。1. 对标层级内部职级:P9 / 首席专家 / Fellow 外部对标:华为 20–…

费用率无法实时监控怎么办?费用率联动预算管理怎么实现?

费用率无法实时监控怎么办?费用率联动预算管理怎么实现?

2026/7/22 0:08:09

很多企业费用管控存在严重滞后性:日常差旅、招待、营销、人力费用持续发生,但费用率只能等到月末结账、营收数据出来后才能计算核对,月度中途费用超标、营收不达标导致的费用率失衡完全无法感知。等到月末发现整体费用率远超预算目标时&#…

设计EDA 研发总监 12 维度 JD(HR 内部仅高管层使用)

设计EDA 研发总监 12 维度 JD(HR 内部仅高管层使用)

2026/7/22 0:08:09

定位:公司 EDA / 设计平台最高管理岗,技术 管理 经营三重决策,对整体流片、效率、质量、成本、团队负最终责任1. 对标层级内部职级:M3 / P8 / 总监级 外部对标:华为 20 级、互联网 M2 / 总监、头部芯片 / EDA 公司研…