Skip to content

.NET环球月刊 2025年第8期 #25

@tonyqus

Description

@tonyqus

行业资讯

1、 .NET 悬赏计划开始

微软安全响应中心(MSRC)在最新博文中宣布,将 .NET 漏洞悬赏计划全面升级,并把单个漏洞的最高奖金从 2 万美元提升至 4 万美元。

• 适用范围:.NET 6/7/8(含预览版)、ASP.NET Core、Entity Framework Core、Blazor,以及 Windows Forms、WPF 等核心运行时与开发框架。
• 奖金梯度:根据漏洞影响面与利用难度,从 2,000 美元到 40,000 美元不等;可导致远程代码执行、权限提升或突破关键安全边界的漏洞奖金额最高。
• 提交要求:需提供完整 PoC、漏洞成因分析,并在 Visual Studio “发布”配置下编译;严禁在生产环境或真实用户数据上测试。
• 处理时效:微软承诺 72 小时内确认漏洞是否符合悬赏范围,30 天内给出初步修复方案;研究人员协助补丁验证可再获 10% 额外奖励。
• 计划成效:过去一年已收到 170 份有效报告,向 45 名研究人员支付超过 25 万美元奖金。

微软表示,随着 .NET 在云端与本地的广泛部署,强化生态安全对客户与开发者至关重要,希望借助全球安全社区力量,进一步提升 .NET 平台的安全韧性。研究人员可通过 MSRC 门户提交报告,并使用官方 Docker 镜像进行本地验证,以避免影响真实服务。

2、 dotinsight 7 月份集锦

这一期 dotInsights(2025 年 7 月)由 JetBrains .NET 团队整理,定位为 .NET 开发者的月度资讯汇。

开篇用一个 C# 小技巧──利用 @ 前缀让保留字成为变量名──作为“冷知识”,随后发布了 JetBrains .NET Days Online 2025 的演讲者招募信息。

核心内容是对社区优质文章与视频的精选链接,主题覆盖面广:

• 代码质量与重构:Emily Bache 演示如何借助 Adapt Parameter 安全地重构遗留代码;Stefan Pölz/Eva Ditzelmüller 详解 Dispose 模式。
• 性能与平台:Steven Giesel 分享 .NET 10 的性能特性;Khalid Abuhakmeh 探索 ASP.NET Core 中的 Server-Sent Events;Jeremy D. Miller 讨论 Wolverine 的“低仪式”Railway 编程。
• 框架与实战:Leomaris Reyes 介绍 MAUI DrawingView;Dennis Doomen 推出 .NET Library Starter Kit;多篇文章讨论 API 合约、OAuth 新流、Task 并发异常处理等。
• 前沿与思考:文章和视频探讨 AI 招聘、公平性、以及“氛围编码”等话题。

“.NET Guide 精选”栏目提炼了两篇教程:Ian Griffiths 的高性能 JSON 序列化(依赖 C#11 代码生成)以及 Khalid Abuhakmeh 的 HTTP 请求时间线分析技巧。

“JetBrains 新闻”板块列出近期产品动态:ReSharper VS Code 公开预览、Rider 2025.2 EAP 的调试与监控增强、OpenTelemetry 插件、SQL/NoSQL 查询语言支持,以及多次小版本补丁发布。同时,GameDev Days 2025 也开始征集演讲者。

整篇通讯既提供了学习资料,又呈现 JetBrains 生态进展,并附有订阅入口与联系方式,鼓励开发者持续关注。

文章推荐

1、 使用架构测试处理 CancellationToken 和 Sealed 类

本文介绍如何利用架构测试(Architecture Tests)在 .NET 项目中自动检查两类常见的编码规范:1) 控制器方法必须接收 CancellationToken,并且参数名称符合 token/cancellationToken;2) 以 View 或 Model 结尾的 DTO 类应被标记为 sealed。作者借助 NetArchTest.Rules 提供的 fluent API,结合反射遍历程序集,动态筛选所有以 Controller 结尾并继承 ControllerBase 的类型,再枚举公开实例方法,找出缺少 CancellationToken 或命名不规范的方法,并使用 Shouldly 断言确保测试失败时能给出精确列表。对于 sealed 校验,同样通过类型后缀过滤,然后调用 BeSealed 规则验证,最后输出未 sealed 的类名。作者强调,这类架构测试并不关注业务逻辑,而是将团队约定固化为自动化检查,能在 CI 阶段及早暴露设计偏差;同时可配合分析器保证 CancellationToken 在调用链中被继续传递。总体而言,文章示范了如何在项目中用少量代码构建“编码守门人”,既提高一致性,又避免日后大规模重构成本。

2、 .NET 8 到 .NET 10 迁移指导

博客指出,.NET 10 将于 2025 年 11 月正式发布并成为 .NET 8 的下一代 LTS 版本(支持至 2028 年)。作者建议:

• 时间规划:.NET 8 结束支持日为 2026-11-10,应在 2025 年 Q3 开始使用预览版(目前已到 Preview 6)测试,预留 3-6 个月完成评估、升级与回归。

• 破坏性变更:文章按技术域列举所有 Breaking Changes,需要同时考虑 .NET 9 与 .NET 10 累积影响。例如默认容器镜像改用 Ubuntu;ActivitySource 行为调整;HttpClient 证书吊销检查默认在线;DriveInfo 在 Linux 返回真实文件系统类型;macOS 不再支持 OpenSSL;单文件发布的本地库搜索路径变更等。EF Core、C# 编译器、MSBuild、Blazor 及 SDK 亦有大量 API 删除或默认行为改变,文中给出迁移前后代码片段与 AppContext 开关。

• 迁移步骤:先更新 <TargetFramework>net10.0</TargetFramework>,然后处理编译警告(建议 TreatWarningsAsErrors);升级或替换第三方包;在 CI 中双版本并行验证;关注跨平台差异(如时间/时区、加密 API、容器基础镜像)。

• 工具支持:使用 .NET Upgrade Assistant(VS 插件或 CLI)可自动修改项目文件、替换过时 API,并生成报告;结合 Roslyn 分析器可完成自定义规则。

• 常见陷阱:忽略警告、依赖库未及时更新、大型单体一次性切换压力过大、UTC 行为变化导致数据偏移等。作者建议分阶段升级、充分自动化测试,并及早在预览版环境中发现问题。

总体而言,.NET 10 带来了性能、安全及标准化改进,但只要提前规划、利用官方工具并保持测试驱动,迁移成本可控,且能确保未来三年的长期支持。

3、 C# MCP SDK 升级

微软 .NET 团队在官方博客发布文章,宣布 MCP(Model Context Protocol)C# SDK 已全面支持 2025-06-18 最新协议规范。此次升级为 .NET 开发者在构建 AI 应用时带来了更丰富、也更安全的能力,主要亮点如下:

  1. 全新的身份验证协议
    新规范将认证服务器与资源服务器职能拆分,可与现有 OAuth 2.0 / OpenID Connect 流程无缝集成。官方推荐在生产环境启用资源指示器与严格的令牌校验,提升安全性。

  2. Elicitation(信息征询)机制
    服务器可以在交互过程中向用户“追问”额外上下文,实现更动态的 AI 体验。SDK 在服务端提供 ElicitAsync 扩展方法,在客户端通过配置 ElicitationHandler 处理征询请求,使控制台 / GUI / Web 客户端都能与用户交互式收集数据。

  3. 结构化工具输出
    工具方法可通过 McpServerTool(UseStructuredContent = true) 明确声明返回结构化数据。SDK 会自动生成 JSON Schema 并在 tools/list 响应中暴露,调用结果也会在 structuredContent 字段中返回,让大模型或宿主程序更容易解析与推理。

  4. 结果中的资源链接
    工具现在可在返回值中直接嵌入 ResourceLinkBlock,为客户端提供资源发现与后续操作入口,适用于生成报告、文件或业务实体等场景。

  5. Schema 与元数据改进

    • _meta 字段支持范围扩大,可存放版本、作者、自定义标签等信息。
    • 名称(name)与标题(title)分离,既保持机器友好标识,又能向用户展示易读标题。
  6. 快速上手
    通过 dotnet add package ModelContextProtocol --prerelease 即可获取新版 SDK。官方文档与示例仓库已同步更新,欢迎社区参与反馈与贡献。

总结:本次更新显著提升了 MCP C# SDK 的安全性、交互性与数据结构表达能力,为 .NET 开发者构建 AI 助手、自动化工具或复杂业务集成提供了更坚实的基础。立即升级体验这些新特性,拥抱更智能的 .NET 未来!

视频推荐

1、 dotnet run app.cs 后的隐藏的功能

Nick Chapsas 在这段视频中深入展示了 .NET 10(预览版)中新加入的“dotnet run app.cs”脚本化功能,并补充了官方演示中遗漏的细节。

  1. 基础能力:单个 C# 文件无需项目即可通过 dotnet run app.cs 执行,Windows、Linux、macOS 均支持。结合 VS Code 扩展,即可获得语法高亮与调试。
  2. Shebang 支持:在文件顶部加入 #!/usr/bin/env dotnet run 并赋予可执行权限后,可直接把 app.cs 作为可执行脚本运行,使用体验类似 Node/Python。
  3. 隐藏命令:除了 run,还可显式执行 dotnet restore app.csdotnet build app.cs 来完成包还原和编译;对应的临时项目文件完全隐式生成。
  4. NuGet 引用:可在文件顶部用 #r "nuget: Humanizer, 2.14.1" 引入包,若不写版本号则默认解析第一个版本;可使用通配符限定次要或修订版本。
  5. 局限性:当前无法引用其他 .cs 文件;团队正讨论新增 import 指令以支持目录或文件级引用。作者也希望未来能提供 dotnet compile app.cs 直接生成 EXE/AOT 二进制。
  6. 设计动机:一方面降低新手门槛、与脚本语言竞争;另一方面为替代 PowerShell/bash 等自动化脚本提供 C# 方案,适用于 CI/CD、基础设施部署等场景。
  7. 反响:社区总体正面,认为对自动化、教学演示、快速原型特别有价值;也有人担忧微软是否应优先投入此方向。

作者最后呼吁开发者提出需求与建议,以帮助团队完善该特性。

2、 .NET MCP 学习

本视频由 Nick Chapsas 邀请 Dan Clarke 讲解如何在 .NET 中快速上手 Model Context Protocol(MCP)。MCP 让 LLM 以统一的协议调用外部服务,被众多厂商与社区迅速采纳。演示中 Dan 创建了一个「Podcast MCP Server」,只需在 Program.cs 中调用 builder.Services.AddMcpServer() 并用 [McpTool] 标注方法,即可把方法暴露为 LLM 可调用的「Tool」。Tool 描述文字决定了模型是否会选择调用它,返回值可用强类型或字符串 JSON。

客户端可在 VS Code 的 Copilot Agent、Rider 或自定义代码中通过标准 IO、SSE 及可流式 HTTP 与 MCP Server 通讯,标准 IO 场景下只需在 mcp.json 写入 dotnet run 命令即可本地启动服务。示例展示了:1)在 VS Code 中选择工具并由模型自动决定调用;2)在代码里通过 IMcpClient 结合 OpenAI IChatClient 以自然语言检索带标签的播客;3)在 Server 端借助「Sampling」反向调用 LLM,把标题改写成幽默风格。

MCP 还支持「Prompt 模板」与「Resource」:开发者可预设常用提示词模板或附加文件/链接,用户在聊天时通过 / 命令一键插入,或将资源上下文发送给模型。

最后 Dan 演示了 Playwright MCP Server,模型自动对网站进行无头浏览、找出错误并生成报告,进一步展示了多工具协同带来的开发新范式。他提醒:设计工具要单一职责、粒度细,以便模型按需组合调用;部署可使用 Docker 镜像,通过 docker run 即可在本地以标准 IO 方式启动。整套流程表明 MCP 简单易用却威力巨大,为未来“对话式开发”奠定了基础。

开源项目

1、 基于.NET的Toml文件读写库Tomlet

Tomlet 是一个完全基于 .NET、零依赖的 TOML 序列化/反序列化库,完整实现了 TOML 1.0.0 规范。它采用“模型驱动”方式:可直接把任意对象序列化为 TOML 字符串,也能把 TOML 文本映射回对象;同时提供 Document/Value API 便于逐级访问、修改键值。

在序列化时 Tomlet 会重新排序文档以提升可读性:先输出简单键值,再输出子表,再输出表数组;小型表和数组会自动内联,可用属性或标志禁止内联。库能够解析、保留并重新写出注释,并通过 TomlInlineComment / TomlPrecedingComment 属性让模型类自带注释。

默认映射基于反射,支持字段和属性,可用 TomlProperty 指定键名,用 TomlNonSerialized 或 [NonSerialized] 忽略成员;若需特殊格式可通过 RegisterMapper 自定义序列化/反序列化逻辑。解析方面提供 Parse、ParseFile 等方法,返回的 TomlDocument/TomlTable 支持 GetString、GetInteger、GetArray 等强类型读取及 ContainsKey、子表导航。

库对错误处理做了细粒度设计,所有解析与映射异常均继承自 TomlException,覆盖重复键、无效数字、表数组冲突等四十余种场景,便于定位问题。实现只依赖标准库,因此可无缝用于 Unity、Blazor、控制台或服务器应用。

总体而言,Tomlet 兼顾易用性、规范完整性与性能,适合在 .NET 项目中读取或生成 TOML 配置文件,尤其适合需要保持注释与排版友好度的场景。

2、 TickerQ

TickerQ 是一个专为 .NET 生态打造的高性能、无反射后台任务调度器,其核心借助 Source Generator 在编译期生成任务注册与调度代码,运行时零反射、开销极小。官方将功能拆分为三大 NuGet 包:TickerQ 核心、TickerQ.EntityFrameworkCore 持久化扩展,以及提供实时监控的 TickerQ.Dashboard。

调度模型支持两类作业:一次性 TimeTicker 与周期性 CronTicker。开发者仅需在普通方法上加上 [TickerFunction] 特性即可将其声明为任务,随后可通过 ITimeTickerManager / ICronTickerManager 以代码动态创建、取消或重试任务。每个任务可配置最大重试次数与自定义间隔,失败后自动按策略回退。

若启用 EF Core 持久化,TickerQ 会将任务队列、锁与执行历史存入数据库,并使用分布式锁与所有权跟踪在多节点实例间协调执行,确保高可用与一次性语义。同时支持在应用重启后自动取消已错过的任务。

Dashboard 通过中间件形式注入,默认路由 /tickerq-dashboard,实时展示系统状态、队列深度、活动任务、执行历史等,并支持基础身份认证保护。

注册使用非常简洁,只需在 Program/Startup 调用 AddTickerQ,可选设置最大并发、全局异常处理器、EF 持久化与 Dashboard 路径;完成后调用 app.UseTickerQ 启用调度引擎。如果不使用 UseModelCustomizerForMigrations,则需在 DbContext 手动 ApplyConfiguration。

TickerQ 与 .NET DI 深度集成,任务方法可直接注入服务,并支持 CancellationToken 优雅取消。项目采用 MIT/Apache-2.0 双 License,文档完善,欢迎社区贡献。

3、 纯.NET实现的2D像素编辑器

PixiEditor 是一个由 C#/.NET 8 构建的跨平台 2D 图像编辑器,目标是为像素绘制、数字绘画、矢量图形与动画等多种场景提供“一站式”解决方案。

核心特性:

  1. 多工具集:内置 Pixel Art、Painting、Vector 三套工具,可在同一画布上混合栅格与矢量图层,并输出 PNG、JPG、SVG、GIF、MP4 等格式。
  2. 动画与时间轴:2.0 版本加入帧动画和时间轴,支持逐帧绘制或借助节点系统制作程序化动画,未来还将加入矢量关键帧。
  3. 节点渲染系统:所有图层、效果都抽象为节点,可自由组合实现平铺纹理、着色器动画乃至简单 3D 形体渲染,为高阶用户提供强扩展性。
  4. UI 体验:借鉴 Photoshop/GIMP 的经典布局,降低学习成本,并默认提供深色主题。

运行与构建:官方发布了 1.0 稳定版(Steam 获 93% 好评)和 2.0 公测版;源码使用 LGPL-3.0 许可,依赖 .NET 8 SDK 与 wasi-sdk,克隆仓库后初始化子模块、配置 WASI_SDK_PATH,并执行 dotnet workload install wasi-experimental 即可在桌面端编译运行。

社区生态:项目官网、论坛与 Discord 提供支持,开发者可参考 Contributing Guide 贡献代码或扩展节点。PixiEditor 致力于在开源社区的协作下,持续向功能完备的通用 2D 编辑平台进化。
4、 AIApiTracer

AIApiTracer 是 Cysharp 团队开发的一款轻量级、本地化的 AI 请求跟踪工具。

核心定位:

  1. 作为本地开发环境中的反向代理,它能拦截并转发对 OpenAI、Anthropic、Azure OpenAI、xAI 以及其他 OpenAI 兼容接口的 HTTP 调用;
  2. 在不依赖任何外部云服务的前提下,将请求与响应内容以可读、友好的方式展示在 Web UI(默认 http://localhost:8080)中,方便开发者调试 Prompt、验证参数或比较不同模型结果;
  3. 仅在内存中保存最近 1000 条记录,不做持久化,强调“本地临时调试”而非生产级审计或团队共享。

快速上手:
• Docker:docker run -p 8080:8080 ghcr.io/cysharp/aiapitracer:latest
• 或从 Release 下载二进制执行 ./AIApiTracer --urls http://localhost:8080/
随后只需把 SDK 或 curl 的 API BaseUrl 改为 http://localhost:8080/endpoint/{provider},例如 OpenAI 改为 /endpoint/openai/v1,Anthropic 改为 /endpoint/anthropic, 即可透明地记录流量。

安全与扩展:
• OpenAI 兼容代理默认关闭,开启需设置环境变量 AIApiTracer__EnableOpenAICompatForwarding=true,否则可能沦为开放代理风险;
• 计划支持 Google Vertex AI、Amazon Bedrock 等更多服务。

总结:AIApiTracer 提供了“像 Cloudflare AI Gateway Logs 但完全本地可用”的体验,适合个人或小型团队在开发阶段对多家大型模型服务做快速调试、对比和排障。

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions