惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Schneier on Security
Schneier on Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Tenable Blog
P
Proofpoint News Feed
V
Vulnerabilities – Threatpost
Project Zero
Project Zero
Latest news
Latest news
S
Schneier on Security
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Threatpost
Simon Willison's Weblog
Simon Willison's Weblog
Cyberwarzone
Cyberwarzone
T
The Exploit Database - CXSecurity.com
C
CERT Recently Published Vulnerability Notes
Spread Privacy
Spread Privacy
Cisco Talos Blog
Cisco Talos Blog
T
Troy Hunt's Blog
S
Secure Thoughts
C
Cisco Blogs
Application and Cybersecurity Blog
Application and Cybersecurity Blog
V2EX - 技术
V2EX - 技术
Hacker News: Ask HN
Hacker News: Ask HN
O
OpenAI News
L
LINUX DO - 最新话题
T
Threat Research - Cisco Blogs
Recent Commits to openclaw:main
Recent Commits to openclaw:main
P
Palo Alto Networks Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
博客园_首页
月光博客
月光博客
博客园 - 【当耐特】
雷峰网
雷峰网
C
CXSECURITY Database RSS Feed - CXSecurity.com
博客园 - 叶小钗
aimingoo的专栏
aimingoo的专栏
L
Lohrmann on Cybersecurity
D
DataBreaches.Net
美团技术团队
B
Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
有赞技术团队
有赞技术团队
D
Docker
Jina AI
Jina AI
The GitHub Blog
The GitHub Blog
H
Hacker News: Front Page
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
AI
AI
Martin Fowler
Martin Fowler
Attack and Defense Labs
Attack and Defense Labs
小众软件
小众软件

博客园 - 邓磊Lei

为什么 Go 一个 HTTP 服务可以同时处理数万连接 gin怎么处理一次http请求的 我的经验:git提交信息分别用什么icon .NET 10 使用 Microsoft.AspNetCore.OpenApi 实现 API 版本管理 ASP.NET Core 内存缓存实战:一篇搞懂该怎么配、怎么避坑 Microsoft Agent Framework + Kimi API 实战:控制台应用跑通单次与多轮 Agent 对话 开发实战:asp.net core + ef core 实现动态可扩展的分页方案 聊聊 ASP.NET Core 中间件和过滤器的区别 Python 入门:从“其他语言”到 Pythonic 思维的完整迁移手册 .NET 进阶之路:异步、并发与内存管理的系统性认知 Redis:延迟双删的适用边界与落地细节 Serilog:从结构化日志认知到 .NET 工程落地 EF Core 原生 SQL 实战:FromSql、SqlQuery 与对象映射边界 EF Core 拦截器实战:SaveChangesInterceptor、CommandInterceptor 与审计落地 ASP.NET Core 外部依赖调用治理实战:HttpClientFactory、Polly 与幂等边界 .NET .Result 避坑指南:不同框架下的死锁与线程池饥饿 EF Core 慢查询排查实战:TagWith、OpenTelemetry、执行计划,30 分钟定位性能瓶颈 EF Core 并发冲突实战:乐观锁、RowVersion 与 DbUpdateConcurrencyException 怎么处理 EF Core 写入链路深拆:从 ChangeTracker 到 SQL Batch 的性能诊断与优化 ASP.NET Core 认证鉴权实战:JWT、Policy 与权限边界怎么落地 C# 异步编程深水区:Task、ValueTask、线程池饥饿与背压设计 EF Core 查询性能黑洞:Include、投影与跟踪策略的边界 从 IApplicationBuilder 到 RequestDelegate:ASP.NET Core 请求管线的性能与可观测性实战 如何在 rider 中配置 SonarQube
C# 也能像 Python 一样写脚本 | .NET 10 构建基于文件的应用
邓磊Lei · 2026-05-06 · via 博客园 - 邓磊Lei

什么是基于文件的应用

在单个文件中编写代码,并且能够运行。在这方面 python 是课代表。如今 C# 也能做到了。在 .NET 10 中,微软引入了基于文件的应用(File-based Apps)的概念,允许开发者在单个 .cs 文件中编写、运行和构建应用程序。这种方式极大地简化了开发流程,特别适合于快速原型设计、脚本编写和小型工具的开发。

环境要求

得安装 .NET 10 SDK 才能使用基于文件的应用功能。可以通过下面的命令来检查 .net 版本:

dotnet --version

这里应该显示 10.0.0 或更高版本。

上示例

示例1: date-checker.cs 使用标准库的应用

var targetDate = DateTime.Now;
Console.WriteLine("当前时间是: " + targetDate);
Console.WriteLine("当前日期是今年的第 {0} 天", targetDate.DayOfYear);

示例2: sales-data-analyse.cs 依赖第三方库的应用

#:property PublishAot=false
#:package CsvHelper@33.0.1


using CsvHelper;
using System.Text.Json;
using System.Globalization;

var json = await File.ReadAllTextAsync("sales_data.json");
var sales = JsonSerializer.Deserialize<List<SaleRecord>>(json);

var topProducts = sales.GroupBy(s => s.Product)
    .Select(g => new
    {
        Product = g.Key,
        TotalAmount = g.Sum(s => s.Amount)
    })
    .OrderByDescending(g => g.TotalAmount)
    .Take(10)
    .ToList();


using var writer = new StreamWriter("top_products.csv");
using var csv = new CsvWriter(writer, CultureInfo.InvariantCulture);
csv.WriteRecords(topProducts);

Console.WriteLine("报告生成成功");

record SaleRecord(string Product, decimal Amount, DateTime Date);

分别使用下面的命令运行这两个示例:

dotnet run .\date-checker.cs
dotnet run .\sales-data-analyse.cs

常用指令

要去使用 #: 开头的指令来配置包、sdk、编译选项。

使用 #:sdk 指令来选择 SDK

默认的SDKMicrosoft.NET.Sdk,如果需要使用 Microsoft.NET.Sdk.Web 来构建 web 应用,可以使用下面的指令:

#:sdk "Microsoft.NET.Sdk.Web"

使用 #:package 指令来引入第三方库

#:package CsvHelper@33.0.1
#:package CsvHelper@*
#:package CsvHelper@33.*

上面三个版本分别表示使用指定版本、最新版本和指定主版本的库。

使用 #:property 指令设置编译选项

编译属性就是 csproj 文件中的属性,可以使用 #:property 指令来设置:

#:property LangVersion=preview
#:property Nullable=disable
#:property PublishAot=false
#:property TargetFramework=net10.0

使用 #:reference 指令来引用本地程序集

#:reference "path/to/your/library.dll"

使用 #:project 指令来引用本地项目

#:project "path/to/your/project.csproj"

CLI 支持

下面是一些支持基于文件的应用的 CLI 命令:

  • dotnet run <file.cs>:运行指定的 .cs 文件。
  • dotnet build <file.cs>:构建指定的 .cs 文件。
  • dotnet publish <file.cs>:发布指定的 .cs 文件。
  • dotnet pack <file.cs>:打包指定的 .cs 文件。
  • dotnet project convert <file.cs>:转换指定的 .cs 文件为一个完整的项目。
  • dotnet restore <file.cs>:还原指定的 .cs 文件中引用的包。
  • dotnet clean <file.cs>:清理指定的 .cs 文件生成的输出。
  • dotnet run <file.cs> -- <args>:运行指定的 .cs 文件,并传递额外的命令行参数。

文章中的实验代码,请参考 https://github.com/denglei1024/dotnet-file-based-apps

参考引用:

如果这篇文章对你有帮助,欢迎点赞、在看、转发给更多 .NET 开发者 ❤️