<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Developer Tools | The .NET Blog</title><link>https://thedotnetblog.com/zh/tags/developer-tools/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>zh</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Fri, 15 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/zh/tags/developer-tools/index.xml" rel="self" type="application/rss+xml"/><item><title>VS Code 1.119：代理会话的 OpenTelemetry、浏览器集成和安全性</title><link>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/visual-studio-code-1-119-highlights/</link><pubDate>Fri, 15 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/visual-studio-code-1-119-highlights/</guid><description>VS Code 1.119（2026 年 5 月）为代理会话添加了 OpenTelemetry 追踪、浏览器标签页共享、信任和安全改进以及 1.119.1 安全补丁。</description><content:encoded>&lt;p&gt;&lt;em&gt;本文已自动翻译。要查看原始版本，&lt;a href="https://thedotnetblog.com/zh/news/emiliano-montesdeoca/visual-studio-code-1-119-highlights/"&gt;请点击此处&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://code.visualstudio.com/updates/v1_119"&gt;VS Code 1.119&lt;/a&gt; 于 2026 年 5 月 6 日发布（随后发布了 1.119.1 安全补丁）。此版本专注于代理可观察性、浏览器交互和减少中断。&lt;/p&gt;
&lt;h2 id="代理会话的-opentelemetry-追踪"&gt;代理会话的 OpenTelemetry 追踪&lt;/h2&gt;
&lt;p&gt;对于在生产环境中运行代理或调试代理工作流的人来说，这是最重要的功能。通过两个设置启用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;github.copilot.chat.otel.enabled&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;github.copilot.chat.otel.otlpEndpoint&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;http://localhost:4318&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;追踪遵循 GenAI 语义约定。每个代理请求创建一个 &lt;code&gt;invoke_agent&lt;/code&gt; 根 span，带有嵌套子 span：&lt;code&gt;chat&lt;/code&gt;、&lt;code&gt;execute_tool&lt;/code&gt; 和 &lt;code&gt;execute_hook&lt;/code&gt;。Token 使用情况按请求报告——包括缓存读取和缓存创建计数。&lt;/p&gt;
&lt;p&gt;适用于本地代理、Copilot CLI 后台代理和 Claude 代理。任何兼容 OTLP 的后端都接受追踪——&lt;a href="https://learn.microsoft.com/en-us/dotnet/aspire/fundamentals/dashboard/standalone"&gt;独立 Aspire 仪表板&lt;/a&gt;非常适合本地开发。&lt;/p&gt;
&lt;h2 id="代理现在可以访问浏览器标签页"&gt;代理现在可以访问浏览器标签页&lt;/h2&gt;
&lt;p&gt;代理可以请求访问内置浏览器标签页——但不是自动的。你必须通过上下文选择器、拖放或建议的上下文明确共享标签页。浏览器中有一个共享按钮用于撤销访问。当代理尝试打开与已打开（未共享）标签页相同域的新标签页时，VS Code 会建议重用现有标签页。&lt;/p&gt;
&lt;h2 id="token-使用优化"&gt;Token 使用优化&lt;/h2&gt;
&lt;p&gt;实验性轻量级模型现在管理代理任务列表，释放主模型用于这项日常工作。减少不需要完整推理能力的任务的 token 使用。&lt;/p&gt;
&lt;h2 id="信任和安全"&gt;信任和安全&lt;/h2&gt;
&lt;p&gt;减少中断：VS Code 1.119 减少了来自代理的网络访问和向临时文件夹写入的提示。1.119.1 补丁解决了特定的安全问题——如果还没有更新，值得升级。&lt;/p&gt;
&lt;h2 id="快速切换到-markdown-预览"&gt;快速切换到 Markdown 预览&lt;/h2&gt;
&lt;p&gt;小但实用：现在可以快速将当前编辑器切换到 Markdown 预览，无需导航。&lt;/p&gt;
&lt;h2 id="vs-code-agentsinsiders-预览版"&gt;VS Code Agents（Insiders 预览版）&lt;/h2&gt;
&lt;p&gt;重新设计的代理会话界面——新的仓库选择器（本地/仓库/远程）、子会话改进、Web 和移动端改进、进度动画——在 Insiders 上的 &lt;a href="https://insiders.vscode.dev/agents"&gt;insiders.vscode.dev/agents&lt;/a&gt; 中可用。&lt;/p&gt;
&lt;p&gt;完整更新日志：&lt;a href="https://code.visualstudio.com/updates/v1_119"&gt;code.visualstudio.com/updates/v1_119&lt;/a&gt;。&lt;/p&gt;</content:encoded></item><item><title>Azure Data Studio 已停用：将您的 Azure SQL 工作流迁移到 VS Code</title><link>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/azure-data-studio-retired-move-to-vscode-sql/</link><pubDate>Sat, 09 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/azure-data-studio-retired-move-to-vscode-sql/</guid><description>Azure Data Studio 于 2025 年 2 月 6 日停用，支持将于 2026 年 2 月 28 日结束。以下是使用 MSSQL 扩展迁移到 VS Code 的完整路径。</description><content:encoded>&lt;p&gt;&lt;em&gt;本文已自动翻译。要查看原始版本，&lt;a href="https://thedotnetblog.com/zh/news/emiliano-montesdeoca/azure-data-studio-retired-move-to-vscode-sql/"&gt;请点击此处&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/azure-sql/azure-data-studio-is-retired-move-your-azure-sql-workflow-to-vs-code-in-10-minutes/"&gt;Azure Data Studio 于 2025 年 2 月 6 日停用&lt;/a&gt;，支持将于 2026 年 2 月 28 日结束——推荐的替代方案是带有 MSSQL 扩展的 VS Code。&lt;/p&gt;
&lt;h2 id="需要安装的内容"&gt;需要安装的内容&lt;/h2&gt;
&lt;p&gt;开始所需的三样东西：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MSSQL 扩展&lt;/strong&gt; — 在 VS Code Marketplace 中搜索&amp;quot;SQL Server (mssql)&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SQL Database Projects 扩展&lt;/strong&gt; — 模式即代码、构建验证、引导式发布&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;.NET 8 SDK&lt;/strong&gt; — 构建系统所需；SDK 缺失是首次运行时最常见的问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="迁移-ads-连接和设置"&gt;迁移 ADS 连接和设置&lt;/h2&gt;
&lt;p&gt;MSSQL 扩展附带 &lt;strong&gt;ADS Migration Toolkit&lt;/strong&gt;，在引导式流程中处理一次性迁移：已保存的连接、连接组、设置和键绑定均自动导入。&lt;/p&gt;
&lt;h2 id="恢复-f5-肌肉记忆"&gt;恢复 F5 肌肉记忆&lt;/h2&gt;
&lt;p&gt;ADS 用户依靠 F5 运行查询。安装 &lt;strong&gt;MSSQL Database Management Keymap&lt;/strong&gt; 扩展，即可恢复 ADS 风格的键绑定，包括 F5。&lt;/p&gt;
&lt;h2 id="sql-database-projects模式即代码"&gt;SQL Database Projects：模式即代码&lt;/h2&gt;
&lt;p&gt;右键单击项目 → &lt;strong&gt;发布&lt;/strong&gt; → 配置目标 → 审查生成的 T-SQL 脚本 → 部署。部署前的脚本预览是关键安全功能。项目模板为表、存储过程和视图生成存根——与 SSDT 相同的工作流。&lt;/p&gt;
&lt;p&gt;常见问题：如果项目是针对不同的 SQL Server 版本创建的，&lt;code&gt;.sqlproj&lt;/code&gt; 文件中的&lt;strong&gt;目标平台不匹配&lt;/strong&gt;将导致构建错误。&lt;/p&gt;
&lt;h2 id="schema-compare-和-schema-designer"&gt;Schema Compare 和 Schema Designer&lt;/h2&gt;
&lt;p&gt;该扩展还包括 &lt;strong&gt;Schema Compare&lt;/strong&gt;（对比项目与已部署数据库的差异）和 &lt;strong&gt;Schema Designer&lt;/strong&gt;（无需手动编写 DDL 即可进行可视化架构编辑）。&lt;/p&gt;
&lt;h2 id="microsoft-fabric-开发者"&gt;Microsoft Fabric 开发者&lt;/h2&gt;
&lt;p&gt;设置相同，但请先从 &lt;strong&gt;Fabric 门户&lt;/strong&gt;开始，先将数据库连接到 Git，再在 VS Code 中打开。Microsoft 有专门的指南：&lt;em&gt;Azure Data Studio to VS Code — What it means for SQL database in Fabric developers&lt;/em&gt;。&lt;/p&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;迁移是一次性的引导式流程，而非手动重建。安装三个工具，运行 ADS Migration Toolkit，恢复键绑定，即可在 10 分钟内恢复正常。&lt;/p&gt;
&lt;p&gt;请参阅&lt;a href="https://devblogs.microsoft.com/azure-sql/azure-data-studio-is-retired-move-your-azure-sql-workflow-to-vs-code-in-10-minutes/"&gt;完整文章&lt;/a&gt;，获取逐步截图和 Fabric 专属演练。&lt;/p&gt;</content:encoded></item><item><title>Azure MCP Server 现在是 .mcpb — 无需任何运行时即可安装</title><link>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/azure-mcp-server-mcpb-no-runtime-install/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/azure-mcp-server-mcpb-no-runtime-install/</guid><description>Azure MCP Server 现已作为 MCP Bundle (.mcpb) 提供 — 下载、拖入 Claude Desktop，完成。无需 Node.js、Python 或 .NET 运行时。</description><content:encoded>&lt;p&gt;&lt;em&gt;本文已自动翻译。如需查看原文，请&lt;a href="https://thedotnetblog.com/zh/news/emiliano-montesdeoca/azure-mcp-server-mcpb-no-runtime-install/"&gt;点击此处&lt;/a&gt;。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;你知道配置 MCP 服务器有什么烦人的地方吗？需要运行时。npm 版需要 Node.js，pip/uvx 需要 Python，dotnet 版需要 .NET SDK。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-mcp-server-mcpb-support/"&gt;Azure MCP Server 刚刚改变了这一切&lt;/a&gt;。它现在作为 &lt;code&gt;.mcpb&lt;/code&gt; — MCP Bundle — 提供，配置方式是拖放。&lt;/p&gt;
&lt;h2 id="什么是-mcp-bundle"&gt;什么是 MCP Bundle？&lt;/h2&gt;
&lt;p&gt;把它想象成 VS Code 扩展（&lt;code&gt;.vsix&lt;/code&gt;）或浏览器扩展（&lt;code&gt;.crx&lt;/code&gt;），但用于 MCP 服务器。&lt;code&gt;.mcpb&lt;/code&gt; 文件是一个独立的 ZIP 存档，包含服务器二进制文件及其所有依赖项。&lt;/p&gt;
&lt;h2 id="如何安装"&gt;如何安装&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. 为你的平台下载 Bundle&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;前往 &lt;a href="https://github.com/microsoft/mcp/releases?q=Azure.Mcp.Server"&gt;GitHub Releases 页面&lt;/a&gt;，下载适合你 OS 和架构的 &lt;code&gt;.mcpb&lt;/code&gt; 文件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 在 Claude Desktop 中安装&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;最简单的方式：在扩展设置页面（&lt;code&gt;☰ → 文件 → 设置 → 扩展&lt;/code&gt;）打开时，将 &lt;code&gt;.mcpb&lt;/code&gt; 文件拖放到 Claude Desktop 窗口中。查看服务器详情，点击安装，确认。完成。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 向 Azure 进行身份验证&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;就这样。Azure MCP Server 使用你现有的 Azure 凭据。&lt;/p&gt;
&lt;h2 id="能做什么"&gt;能做什么&lt;/h2&gt;
&lt;p&gt;直接从 AI 客户端访问 100 多个 Azure 服务工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;查询和管理 Cosmos DB、Storage、Key Vault、App Service、Foundry&lt;/li&gt;
&lt;li&gt;为任何任务生成 &lt;code&gt;az&lt;/code&gt; CLI 命令&lt;/li&gt;
&lt;li&gt;创建 Bicep 和 Terraform 模板&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="开始使用"&gt;开始使用&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;下载&lt;/strong&gt;: &lt;a href="https://github.com/microsoft/mcp/releases?q=Azure.Mcp.Server-"&gt;GitHub Releases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;仓库&lt;/strong&gt;: &lt;a href="https://aka.ms/azmcp"&gt;aka.ms/azmcp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文档&lt;/strong&gt;: &lt;a href="https://aka.ms/azmcp/docs"&gt;aka.ms/azmcp/docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;查看&lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-mcp-server-mcpb-support/"&gt;完整文章&lt;/a&gt;。&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.118：Copilot CLI 获得会话名称、模型徽章和 TypeScript 7.0 夜间版选择加入</title><link>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/vscode-1-118-copilot-cli-session-names-model-badge/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/vscode-1-118-copilot-cli-session-names-model-badge/</guid><description>Visual Studio Code 1.118 是一个专注于 Copilot CLI 改进的版本——会话命名、模型徽章、自动模型选择以及 TypeScript 7.0 夜间版选择加入。</description><content:encoded>&lt;p&gt;&lt;em&gt;本文已自动翻译。如需查看原文，请&lt;a href="https://thedotnetblog.com/zh/news/emiliano-montesdeoca/vscode-1-118-copilot-cli-session-names-model-badge/"&gt;点击此处&lt;/a&gt;。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://code.visualstudio.com/updates/v1_118"&gt;Visual Studio Code 1.118&lt;/a&gt; 是一个较小的专注版本——主要是 Copilot CLI 的改进——但有几点值得关注。&lt;/p&gt;
&lt;h2 id="copilot-cli会话拥有真实名称"&gt;Copilot CLI：会话拥有真实名称&lt;/h2&gt;
&lt;p&gt;Copilot CLI SDK 的会话标题 API 现在用作会话名称的真实来源。会话显示 SDK 中的实际名称，而非自动生成的标签。&lt;/p&gt;
&lt;h2 id="使用键盘快捷键快速切换会话"&gt;使用键盘快捷键快速切换会话&lt;/h2&gt;
&lt;p&gt;Agents 应用现在绑定了 &lt;code&gt;Ctrl+1&lt;/code&gt;、&lt;code&gt;Ctrl+2&lt;/code&gt; 等快捷键，用于快速切换会话。&lt;/p&gt;
&lt;h2 id="聊天中的模型徽章"&gt;聊天中的模型徽章&lt;/h2&gt;
&lt;p&gt;Copilot CLI 在聊天面板中的回复现在显示模型徽章——一眼即可看出哪个模型处理了每个请求。&lt;/p&gt;
&lt;h2 id="copilot-cli-中的自动模型选择"&gt;Copilot CLI 中的自动模型选择&lt;/h2&gt;
&lt;p&gt;自动模型选择功能——之前在 Copilot 的其他部分已可用——现在也在 Copilot CLI 代理中工作。&lt;/p&gt;
&lt;h2 id="typescript-70-夜间版选择加入"&gt;TypeScript 7.0 夜间版选择加入&lt;/h2&gt;
&lt;p&gt;现在可以直接从 VS Code 设置中选择加入测试 TypeScript 7.0 夜间版。TypeScript 7.0 是一个重大版本（&lt;a href="https://devblogs.microsoft.com/typescript/announcing-typescript-7-0-beta/"&gt;测试版几天前发布&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;查看&lt;a href="https://code.visualstudio.com/updates/v1_118"&gt;完整发行说明&lt;/a&gt;。&lt;/p&gt;</content:encoded></item><item><title>azd钩子支持Python、TypeScript和.NET：告别Shell脚本</title><link>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/azd-hooks-python-javascript-typescript-dotnet/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/azd-hooks-python-javascript-typescript-dotnet/</guid><description>Azure Developer CLI现在支持用Python、JavaScript、TypeScript或.NET编写钩子。不再需要仅仅为了运行迁移脚本就切换到Bash。</description><content:encoded>&lt;p&gt;&lt;em&gt;本文已自动翻译。如需查看原始版本，请&lt;a href="https://thedotnetblog.com/zh/news/emiliano-montesdeoca/azd-hooks-python-javascript-typescript-dotnet/"&gt;点击此处&lt;/a&gt;。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;如果你曾经有一个完全用.NET构建的项目，却还需要为azd钩子编写Bash脚本，你一定懂那种痛苦。当项目其他部分都是C#时，为什么要在pre-provisioning步骤中切换到Shell语法呢？&lt;/p&gt;
&lt;p&gt;这个问题现在有了官方解决方案。Azure Developer CLI &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-multi-language-hooks/"&gt;刚刚发布了钩子的多语言支持&lt;/a&gt;，效果正如预期的那么好。&lt;/p&gt;
&lt;h2 id="什么是钩子"&gt;什么是钩子&lt;/h2&gt;
&lt;p&gt;钩子是在&lt;code&gt;azd&lt;/code&gt;生命周期关键节点运行的脚本——预置配置之前、部署之后等。它们在&lt;code&gt;azure.yaml&lt;/code&gt;中定义，无需修改CLI即可注入自定义逻辑。&lt;/p&gt;
&lt;p&gt;此前只支持Bash和PowerShell。现在可以使用&lt;strong&gt;Python、JavaScript、TypeScript或.NET&lt;/strong&gt;——&lt;code&gt;azd&lt;/code&gt;会自动处理其余的一切。&lt;/p&gt;
&lt;h2 id="检测机制"&gt;检测机制&lt;/h2&gt;
&lt;p&gt;只需将钩子指向一个文件，&lt;code&gt;azd&lt;/code&gt;就会从文件扩展名推断语言：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;hooks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;preprovision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/setup.py&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;postdeploy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/seed.ts&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;postprovision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/migrate.cs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;无需额外配置。如果扩展名不明确，可以添加&lt;code&gt;kind: python&lt;/code&gt;（或相应语言）来明确指定。&lt;/p&gt;
&lt;h2 id="各语言的重要细节"&gt;各语言的重要细节&lt;/h2&gt;
&lt;h3 id="python"&gt;Python&lt;/h3&gt;
&lt;p&gt;在脚本旁边（或任意父目录中）放置&lt;code&gt;requirements.txt&lt;/code&gt;或&lt;code&gt;pyproject.toml&lt;/code&gt;，&lt;code&gt;azd&lt;/code&gt;会自动创建虚拟环境、安装依赖并运行脚本。&lt;/p&gt;
&lt;h3 id="javascript和typescript"&gt;JavaScript和TypeScript&lt;/h3&gt;
&lt;p&gt;同样的模式——在脚本附近放置&lt;code&gt;package.json&lt;/code&gt;，&lt;code&gt;azd&lt;/code&gt;会先运行&lt;code&gt;npm install&lt;/code&gt;。对于TypeScript，使用&lt;code&gt;npx tsx&lt;/code&gt;，无需编译步骤，也不需要&lt;code&gt;tsconfig.json&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id="net"&gt;.NET&lt;/h3&gt;
&lt;p&gt;提供两种模式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;项目模式&lt;/strong&gt;：如果脚本旁边有&lt;code&gt;.csproj&lt;/code&gt;文件，&lt;code&gt;azd&lt;/code&gt;会自动运行&lt;code&gt;dotnet restore&lt;/code&gt;和&lt;code&gt;dotnet build&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;单文件模式&lt;/strong&gt;：在.NET 10+上，独立的&lt;code&gt;.cs&lt;/code&gt;文件可通过&lt;code&gt;dotnet run script.cs&lt;/code&gt;直接运行，无需项目文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="执行器特定配置"&gt;执行器特定配置&lt;/h2&gt;
&lt;p&gt;每种语言都支持可选的&lt;code&gt;config&lt;/code&gt;块：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;hooks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;preprovision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/setup.ts&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;packageManager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;pnpm&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;postprovision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/migrate.cs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Release&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;framework&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;net10.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="对net开发者的意义"&gt;对.NET开发者的意义&lt;/h2&gt;
&lt;p&gt;钩子曾是基于azd的项目中最后一个强制语言切换的地方。现在，整个部署流水线——从应用代码到基础设施脚本再到生命周期钩子——都可以使用同一种语言。你可以在钩子中复用现有的.NET工具，引用共享类库，不再需要维护Shell脚本。&lt;/p&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;这看起来是个小改动，但它切实减少了日常azd工作流程中的摩擦。钩子的多语言支持现已可用——查阅&lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-multi-language-hooks/"&gt;官方文章&lt;/a&gt;获取完整文档。&lt;/p&gt;</content:encoded></item><item><title>Foundry Toolboxes：AI Agent工具的统一端点</title><link>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/foundry-toolboxes-curate-manage-tools-ai-agents/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/foundry-toolboxes-curate-manage-tools-ai-agents/</guid><description>Microsoft Foundry已推出公开预览版Toolboxes——一种通过单一MCP兼容端点管理和公开AI Agent工具的方式，无需在每个Agent中重新配置所有内容。</description><content:encoded>&lt;p&gt;&lt;em&gt;本文已自动翻译。如需查看原始版本，请&lt;a href="https://thedotnetblog.com/zh/news/emiliano-montesdeoca/foundry-toolboxes-curate-manage-tools-ai-agents/"&gt;点击此处&lt;/a&gt;。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;有一个问题听起来无聊，直到你真正遇到它：你的组织在构建多个AI Agent，每个都需要工具，每个团队都从头开始配置。相同的Web搜索集成、相同的Azure AI Search配置、相同的GitHub MCP服务器连接——但在不同的仓库里，由不同的团队，使用不同的凭据，没有任何共享治理。&lt;/p&gt;
&lt;p&gt;Microsoft Foundry刚刚以公开预览版发布了&lt;a href="https://devblogs.microsoft.com/foundry/introducing-toolboxes-in-foundry/"&gt;Toolboxes&lt;/a&gt;，这是对该问题的直接回应。&lt;/p&gt;
&lt;h2 id="什么是toolbox"&gt;什么是Toolbox&lt;/h2&gt;
&lt;p&gt;Toolbox是一个有命名的、可复用的工具包，在Foundry中定义一次，通过单一MCP兼容端点公开。任何能够使用MCP的Agent运行时都可以消费它——不受限于Foundry Agents。&lt;/p&gt;
&lt;p&gt;承诺很简单：&lt;strong&gt;build once, consume anywhere&lt;/strong&gt;。定义工具，集中配置身份验证（OAuth直通、Entra托管标识），发布端点。需要这些工具的每个Agent连接到端点即可获取全部工具。&lt;/p&gt;
&lt;h2 id="四个支柱今天两个可用"&gt;四个支柱（今天两个可用）&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;支柱&lt;/th&gt;
&lt;th&gt;状态&lt;/th&gt;
&lt;th&gt;功能&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Discover&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;即将推出&lt;/td&gt;
&lt;td&gt;无需手动搜索即可发现已批准的工具&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Build&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;现已可用&lt;/td&gt;
&lt;td&gt;将工具整合到可复用包中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Consume&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;现已可用&lt;/td&gt;
&lt;td&gt;单一MCP端点公开所有工具&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Govern&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;即将推出&lt;/td&gt;
&lt;td&gt;集中身份验证+所有工具调用的可观测性&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="实践示例"&gt;实践示例&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;azure.identity&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;DefaultAzureCredential&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;azure.ai.projects&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AIProjectClient&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AIProjectClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;FOUNDRY_PROJECT_ENDPOINT&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;credential&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DefaultAzureCredential&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;toolbox_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toolboxes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_toolbox_version&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;toolbox_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;customer-feedback-triaging-toolbox&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;搜索文档并回应GitHub issues&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;web_search&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;搜索公开文档&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;azure_ai_search&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;index_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;internal-docs&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;mcp_server&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;server_url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://your-github-mcp-server.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;发布后，Foundry提供统一端点。一次连接，获取所有工具。&lt;/p&gt;
&lt;h2 id="不受限于foundry-agents"&gt;不受限于Foundry Agents&lt;/h2&gt;
&lt;p&gt;Toolboxes在Foundry中&lt;strong&gt;创建和管理&lt;/strong&gt;，但消费面是开放的MCP协议。可以从使用Microsoft Agent Framework或LangGraph的自定义Agent、GitHub Copilot和其他MCP兼容IDE以及任何支持MCP的运行时中使用它们。&lt;/p&gt;
&lt;h2 id="为什么现在重要"&gt;为什么现在重要&lt;/h2&gt;
&lt;p&gt;多Agent浪潮正在进入生产环境。每个新Agent都是重复配置、过期凭据和不一致行为的新风险面。Build + Consume基础足以开始集中化。当Govern支柱推出时，你将拥有对整个Agent群完全可观测、集中控制的工具层。&lt;/p&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;还是早期阶段——公开预览，Python SDK优先，Discover和Govern仍在路上。但模型是稳固的，MCP原生设计意味着它可以与你已经在构建的工具配合使用。查阅&lt;a href="https://devblogs.microsoft.com/foundry/introducing-toolboxes-in-foundry/"&gt;官方公告&lt;/a&gt;了解详情。&lt;/p&gt;</content:encoded></item><item><title>Windows App Dev CLI v0.3：从终端实现F5调试和面向智能体的UI自动化</title><link>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/</guid><description>Windows App Development CLI v0.3带来了winapp run（从终端进行调试启动）、winapp ui（UI自动化）以及一个让dotnet run支持打包应用的NuGet包。</description><content:encoded>&lt;p&gt;&lt;em&gt;本文已自动翻译。如需查看原文，请&lt;a href="https://thedotnetblog.com/zh/news/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/"&gt;点击这里&lt;/a&gt;。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Visual Studio的F5体验非常棒。但是，仅仅为了启动和调试一个打包的Windows应用而打开VS，在CI流水线、自动化工作流或AI智能体执行测试时就显得过于繁重了。&lt;/p&gt;
&lt;p&gt;Windows App Development CLI v0.3&lt;a href="https://devblogs.microsoft.com/ifdef-windows/windows-app-development-cli-v0-3-new-run-and-ui-commands-plus-dotnet-run-support-for-packaged-apps/"&gt;正式发布&lt;/a&gt;，通过两个核心功能直接解决了这个问题：&lt;code&gt;winapp run&lt;/code&gt;和&lt;code&gt;winapp ui&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="winapp-run随处可用的f5"&gt;winapp run：随处可用的F5&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;winapp run&lt;/code&gt;接受一个未打包的应用文件夹和清单，执行VS在调试启动时所做的一切：注册松散包、启动应用，并在重新部署之间保留&lt;code&gt;LocalState&lt;/code&gt;。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 构建应用，然后作为打包应用运行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winapp run ./bin/Debug
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;支持WinUI、WPF、WinForms、Console、Avalonia等。各模式同时面向开发者和自动化工作流：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--detach&lt;/code&gt;&lt;/strong&gt;：启动后立即将控制权返回给终端。非常适合CI/自动化。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--unregister-on-exit&lt;/code&gt;&lt;/strong&gt;：应用关闭时清理已注册的包。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--debug-output&lt;/code&gt;&lt;/strong&gt;：实时捕获&lt;code&gt;OutputDebugString&lt;/code&gt;消息和异常。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="新nuget包打包应用的dotnet-run支持"&gt;新NuGet包：打包应用的dotnet run支持&lt;/h2&gt;
&lt;p&gt;面向.NET开发者，新增了一个NuGet包：&lt;code&gt;Microsoft.Windows.SDK.BuildTools.WinApp&lt;/code&gt;。安装后，&lt;code&gt;dotnet run&lt;/code&gt;处理整个内循环：构建、准备松散布局包、在Windows中注册和启动——一步完成。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winapp init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 或&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet add package Microsoft.Windows.SDK.BuildTools.WinApp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="winapp-ui从命令行实现ui自动化"&gt;winapp ui：从命令行实现UI自动化&lt;/h2&gt;
&lt;p&gt;这是开启智能体场景的功能。&lt;code&gt;winapp ui&lt;/code&gt;从终端提供对任何正在运行的Windows应用（WPF、WinForms、Win32、Electron、WinUI3）的完整UI自动化访问。&lt;/p&gt;
&lt;p&gt;可以实现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;列出所有顶层窗口&lt;/li&gt;
&lt;li&gt;遍历窗口的完整UI自动化树&lt;/li&gt;
&lt;li&gt;按名称、类型或自动化ID搜索元素&lt;/li&gt;
&lt;li&gt;单击、调用和设置值&lt;/li&gt;
&lt;li&gt;截图&lt;/li&gt;
&lt;li&gt;等待元素出现——非常适合测试同步&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;将&lt;code&gt;winapp ui&lt;/code&gt;与&lt;code&gt;winapp run&lt;/code&gt;结合使用，即可从终端实现完整的构建→启动→验证工作流。智能体可以运行应用、检查UI状态、以编程方式交互并验证结果。&lt;/p&gt;
&lt;h2 id="其他新功能"&gt;其他新功能&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;winapp unregister&lt;/code&gt;&lt;/strong&gt;：测试完成后删除旁加载的包。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;winapp manifest add-alias&lt;/code&gt;&lt;/strong&gt;：添加别名，从终端按名称启动应用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tab补全&lt;/strong&gt;：一条命令配置PowerShell补全。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="安装方式"&gt;安装方式&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winget install Microsoft.WinAppCli
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 或&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install -g @microsoft/winappcli
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;CLI处于公开预览阶段。完整文档请查看&lt;a href="https://github.com/microsoft/WinAppCli"&gt;GitHub仓库&lt;/a&gt;，所有详细信息请查看&lt;a href="https://devblogs.microsoft.com/ifdef-windows/windows-app-development-cli-v0-3-new-run-and-ui-commands-plus-dotnet-run-support-for-packaged-apps/"&gt;原始公告&lt;/a&gt;。&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.117：Agent 拥有了自己的 Git 分支，我举双手赞成</title><link>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/vscode-1-117-agents-autopilot-worktrees/</link><pubDate>Sun, 19 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/vscode-1-117-agents-autopilot-worktrees/</guid><description>VS Code 1.117 为 Agent 会话带来了 worktree 隔离、持久化 Autopilot 模式和子 Agent 支持。Agent 编码工作流变得更加真实了。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;本文为自动翻译。查看原文请&lt;a href="https://thedotnetblog.com/zh/news/emiliano-montesdeoca/vscode-1-117-agents-autopilot-worktrees/"&gt;点击这里&lt;/a&gt;。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;ldquo;AI 助手&amp;quot;和&amp;quot;AI 队友&amp;quot;之间的界限越来越模糊。VS Code 1.117 刚刚发布，&lt;a href="https://code.visualstudio.com/updates/v1_117"&gt;完整的发行说明&lt;/a&gt;内容丰富，但核心很明确：Agent 正在成为你开发工作流中的一等公民。&lt;/p&gt;
&lt;p&gt;以下是真正重要的内容。&lt;/p&gt;
&lt;h2 id="autopilot-模式终于能记住你的偏好了"&gt;Autopilot 模式终于能记住你的偏好了&lt;/h2&gt;
&lt;p&gt;以前，你每次开始新会话都得重新启用 Autopilot。很烦。现在你的权限模式会在会话之间持久化，你还可以配置默认值。&lt;/p&gt;
&lt;p&gt;Agent Host 支持三种会话配置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Default&lt;/strong&gt; — 工具在运行前会请求确认&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bypass&lt;/strong&gt; — 自动批准一切&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autopilot&lt;/strong&gt; — 完全自主，自己回答问题并继续执行&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你正在搭建一个带有迁移、Docker 和 CI 的新 .NET 项目——设置一次 Autopilot 就行了。这个偏好会一直保持。&lt;/p&gt;
&lt;h2 id="agent-会话的-worktree-和-git-隔离"&gt;Agent 会话的 worktree 和 git 隔离&lt;/h2&gt;
&lt;p&gt;这是重头戏。Agent 会话现在支持完整的 worktree 和 git 隔离。这意味着当一个 Agent 处理任务时，它会获得自己的分支和工作目录。你的主分支完全不受影响。&lt;/p&gt;
&lt;p&gt;更好的是——Copilot CLI 会为这些 worktree 会话生成有意义的分支名称。不再是 &lt;code&gt;agent-session-abc123&lt;/code&gt;。你会得到一个真正描述 Agent 正在做什么的名称。&lt;/p&gt;
&lt;p&gt;对于管理多个功能分支或在长时间脚手架任务运行期间修复 bug 的 .NET 开发者来说，这是一个游戏规则的改变。你可以让一个 Agent 在一个 worktree 中构建 API 控制器，同时你在另一个 worktree 中调试服务层问题。没有冲突。没有 stash。没有混乱。&lt;/p&gt;
&lt;h2 id="子-agent-和-agent-团队"&gt;子 Agent 和 Agent 团队&lt;/h2&gt;
&lt;p&gt;Agent Host Protocol 现在支持子 Agent。一个 Agent 可以启动其他 Agent 来处理任务的各个部分。把它想象成委派——你的主 Agent 负责协调，专门的 Agent 处理各个部分。&lt;/p&gt;
&lt;p&gt;这还处于早期阶段，但对 .NET 工作流的潜力显而易见。想象一下，一个 Agent 处理你的 EF Core 迁移，另一个设置你的集成测试。我们还没有完全到达那里，但协议支持现在落地意味着工具很快就会跟上。&lt;/p&gt;
&lt;h2 id="agent-发送输入时终端输出自动包含"&gt;Agent 发送输入时终端输出自动包含&lt;/h2&gt;
&lt;p&gt;虽小但有意义。当 Agent 向终端发送输入时，终端输出现在会自动包含在上下文中。以前，Agent 需要额外的一个回合才能读取发生了什么。&lt;/p&gt;
&lt;p&gt;如果你曾经看到一个 Agent 运行 &lt;code&gt;dotnet build&lt;/code&gt;，失败了，然后又需要一次往返才能看到错误——这种摩擦消失了。它立即看到输出并做出反应。&lt;/p&gt;
&lt;h2 id="macos-上的-agents-应用自动更新"&gt;macOS 上的 Agents 应用自动更新&lt;/h2&gt;
&lt;p&gt;macOS 上的独立 Agents 应用现在可以自动更新了。不再需要手动下载新版本。它会自动保持最新。&lt;/p&gt;
&lt;h2 id="值得了解的小改进"&gt;值得了解的小改进&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;package.json 悬停提示&lt;/strong&gt;现在同时显示已安装版本和最新可用版本。如果你在 .NET 项目旁边管理 npm 工具，这很有用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JSDoc 注释中的图片&lt;/strong&gt;在悬停和补全中正确渲染。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copilot CLI 会话&lt;/strong&gt;现在会显示是由 VS Code 还是外部创建的——当你在终端之间切换时很方便。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copilot CLI、Claude Code 和 Gemini CLI&lt;/strong&gt; 被识别为 shell 类型。编辑器知道你在运行什么。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;VS Code 1.117 不是一个花哨的功能堆砌。它是基础设施。Worktree 隔离、持久化权限、子 Agent 协议——这些是构建一个工作流的基石，在这个工作流中，Agent 可以处理真实的并行任务而不会干扰你的代码。&lt;/p&gt;
&lt;p&gt;如果你正在用 .NET 开发，还没有尝试 Agent 工作流，说实话，现在就是开始的时候。&lt;/p&gt;</content:encoded></item><item><title>Docker Sandbox 让 Copilot 代理重构你的代码而不危及你的机器</title><link>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/copilot-docker-sandbox-agentic-refactoring/</link><pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/copilot-docker-sandbox-agentic-refactoring/</guid><description>Docker Sandbox 为 GitHub Copilot 代理提供安全的微型虚拟机，让它们可以自由重构——无需权限提示，不会对主机造成风险。这就是它为什么会改变大规模 .NET 现代化的一切。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;本文为自动翻译。查看原文请&lt;a href="https://thedotnetblog.com/zh/news/emiliano-montesdeoca/copilot-docker-sandbox-agentic-refactoring/"&gt;点击这里&lt;/a&gt;。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你用过 Copilot 的代理模式做一些超出小修改范围的事情，你一定知道那种痛苦。每次写文件，每个终端命令——又一个权限提示。现在想象一下在 50 个项目上这样操作。一点都不好玩。&lt;/p&gt;
&lt;p&gt;Azure 团队刚发布了一篇关于 &lt;a href="https://devblogs.microsoft.com/all-things-azure/best-of-both-worlds-for-agentic-refactoring-github-copilot-microvms-via-docker-sandbox/"&gt;GitHub Copilot 代理的 Docker Sandbox&lt;/a&gt; 的文章，说实话，这是我见过的最实用的代理工具改进之一。它使用微型虚拟机为 Copilot 提供一个完全隔离的环境，让它可以随意操作——安装包、运行构建、执行测试——而不会触及你的主机系统。&lt;/p&gt;
&lt;h2 id="docker-sandbox-实际给你带来什么"&gt;Docker Sandbox 实际给你带来什么&lt;/h2&gt;
&lt;p&gt;核心思路很简单：启动一个带有完整 Linux 环境的轻量级微型虚拟机，将你的工作区同步进去，然后让 Copilot 代理在里面自由操作。完成后，更改会同步回来。&lt;/p&gt;
&lt;p&gt;以下是让它不仅仅是&amp;quot;在容器里运行东西&amp;quot;的特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;双向工作区同步&lt;/strong&gt;，保留绝对路径。你的项目结构在沙箱内看起来完全一样。不会有路径相关的构建失败。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;私有 Docker 守护进程&lt;/strong&gt;在微型虚拟机内运行。代理可以构建和运行容器，而无需挂载你主机的 Docker socket。这对安全性来说意义重大。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP/HTTPS 过滤代理&lt;/strong&gt;控制代理在网络上可以访问什么。你来决定允许哪些注册表和端点。沙箱内恶意 &lt;code&gt;npm install&lt;/code&gt; 带来的供应链攻击？已封锁。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;YOLO 模式&lt;/strong&gt;——是的，他们就是这么叫的。代理运行时无需权限提示，因为它根本无法损坏你的主机。每一个破坏性操作都被隔离了。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="为什么-net-开发者应该关注"&gt;为什么 .NET 开发者应该关注&lt;/h2&gt;
&lt;p&gt;想想现在有多少团队正在面对现代化工作。你有一个包含 30 个项目的 .NET Framework 解决方案，需要迁移到 .NET 9。那是数百个文件的更改——项目文件、命名空间更新、API 替换、NuGet 迁移。&lt;/p&gt;
&lt;p&gt;使用 Docker Sandbox，你可以将 Copilot 代理指向一个项目，让它在微型虚拟机内自由重构，运行 &lt;code&gt;dotnet build&lt;/code&gt; 和 &lt;code&gt;dotnet test&lt;/code&gt; 进行验证，然后只接受那些真正有效的更改。不用担心它在实验过程中意外破坏你的本地开发环境。&lt;/p&gt;
&lt;p&gt;文章还描述了运行&lt;strong&gt;并行代理舰队&lt;/strong&gt;的场景——每个代理在自己的沙箱中——同时处理不同的项目。对于大型 .NET 解决方案或微服务架构来说，这是一个巨大的时间节省。每个服务一个代理，全部隔离运行，全部独立验证。&lt;/p&gt;
&lt;h2 id="安全角度很重要"&gt;安全角度很重要&lt;/h2&gt;
&lt;p&gt;大多数人忽略的一点是：当你让 AI 代理执行任意命令时，你是在把整台机器都托付给它。Docker Sandbox 翻转了这个模型。代理在一次性环境中获得完全自主权。网络代理确保它只能从已批准的来源下载。你的主机文件系统、Docker 守护进程和凭据完好无损。&lt;/p&gt;
&lt;p&gt;对于有合规要求的团队——这是大多数企业级 .NET 公司的情况——这就是&amp;quot;我们不能使用代理式 AI&amp;quot;和&amp;quot;我们可以安全地采用它&amp;quot;之间的区别。&lt;/p&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;Docker Sandbox 解决了代理式编程的根本矛盾：代理需要自由才能发挥作用，但在你的主机上拥有自由是危险的。微型虚拟机两者兼得。如果你正在规划任何大规模的 .NET 重构或现代化，现在就值得设置起来。Copilot 的代码智能与安全执行环境的结合，正是生产团队一直在等待的。&lt;/p&gt;</content:encoded></item><item><title>别再盯着终端了：Aspire 的分离模式改变了工作流程</title><link>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/aspire-detached-mode-free-your-terminal/</link><pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/aspire-detached-mode-free-your-terminal/</guid><description>Aspire 13.2 让你在后台运行 AppHost 并释放终端。结合新的 CLI 命令和代理支持，这比听起来重要得多。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;本文为自动翻译。查看原文请&lt;a href="https://thedotnetblog.com/zh/news/emiliano-montesdeoca/aspire-detached-mode-free-your-terminal/"&gt;点击这里&lt;/a&gt;。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;每次运行 Aspire AppHost，你的终端就没了。被锁住了。一直占用到你按 Ctrl+C 为止。需要快速运行个命令？打开另一个标签页。想查看日志？再开一个标签页。这是一种小摩擦，但积少成多。&lt;/p&gt;
&lt;p&gt;Aspire 13.2 解决了这个问题。James Newton-King &lt;a href="https://devblogs.microsoft.com/aspire/aspire-detached-mode-and-process-management/"&gt;写了完整的详情&lt;/a&gt;，说实话，这是那种一用就立刻改变工作方式的功能。&lt;/p&gt;
&lt;h2 id="分离模式一条命令终端回来了"&gt;分离模式：一条命令，终端回来了&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这是 &lt;code&gt;aspire run --detach&lt;/code&gt; 的简写。你的 AppHost 在后台启动，终端立即回到你手中。不需要额外的标签页。不需要终端多路复用器。就是你的提示符，随时可用。&lt;/p&gt;
&lt;h2 id="管理正在运行的进程"&gt;管理正在运行的进程&lt;/h2&gt;
&lt;p&gt;关键在于——在后台运行只有在你能管理那些进程时才有用。Aspire 13.2 为此提供了一整套 CLI 命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# List all running AppHosts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire ps
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Inspect the state of a specific AppHost&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire describe
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Stream logs from a running AppHost&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire logs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Stop a specific AppHost&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire stop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这让 Aspire CLI 变成了一个真正的进程管理器。你可以启动多个 AppHost，检查它们的状态，跟踪日志，然后关闭它们——全部在一个终端会话中完成。&lt;/p&gt;
&lt;h2 id="与隔离模式结合使用"&gt;与隔离模式结合使用&lt;/h2&gt;
&lt;p&gt;分离模式与隔离模式天然搭配。想在后台运行同一个项目的两个实例而不产生端口冲突？&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire start --isolated
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire start --isolated
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;每个实例都会获得随机端口、独立的密钥和自己的生命周期。用 &lt;code&gt;aspire ps&lt;/code&gt; 查看两者，用 &lt;code&gt;aspire stop&lt;/code&gt; 停掉不需要的那个。&lt;/p&gt;
&lt;h2 id="为什么这对编码代理意义重大"&gt;为什么这对编码代理意义重大&lt;/h2&gt;
&lt;p&gt;这才是真正有趣的地方。在你的终端中工作的编码代理现在可以：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用 &lt;code&gt;aspire start&lt;/code&gt; 启动应用&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;aspire describe&lt;/code&gt; 查询状态&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;aspire logs&lt;/code&gt; 检查日志来诊断问题&lt;/li&gt;
&lt;li&gt;完成后用 &lt;code&gt;aspire stop&lt;/code&gt; 停止应用&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所有操作都不会失去终端会话。在分离模式之前，运行你的 AppHost 的代理会把自己锁在终端里。现在它可以启动、观察、迭代和清理——这正是你期望自主代理的工作方式。&lt;/p&gt;
&lt;p&gt;Aspire 团队在这方面下了功夫。运行 &lt;code&gt;aspire agent init&lt;/code&gt; 会设置一个 Aspire 技能文件，教会代理这些命令。这样，像 Copilot 的编码代理这样的工具就能直接管理你的 Aspire 工作负载。&lt;/p&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;分离模式是一个伪装成简单标志的工作流升级。你不再需要在终端之间切换上下文，代理不再阻塞自己，新的 CLI 命令让你真正看到正在运行的内容。它实用、干净，让日常开发循环明显更顺畅。&lt;/p&gt;
&lt;p&gt;阅读&lt;a href="https://devblogs.microsoft.com/aspire/aspire-detached-mode-and-process-management/"&gt;完整文章&lt;/a&gt;了解所有详情，并通过 &lt;code&gt;aspire update --self&lt;/code&gt; 获取 Aspire 13.2。&lt;/p&gt;</content:encoded></item><item><title>Azure MCP 工具现已内置于 Visual Studio 2022 — 无需安装扩展</title><link>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/azure-mcp-tools-built-into-visual-studio-2022/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/azure-mcp-tools-built-into-visual-studio-2022/</guid><description>Azure MCP 工具作为 Visual Studio 2022 Azure 开发工作负载的一部分随附发布。超过 230 个工具、45 项 Azure 服务，零扩展安装。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;本文为自动翻译。如需查看原文，请&lt;a href="https://thedotnetblog.com/zh/news/emiliano-montesdeoca/azure-mcp-tools-built-into-visual-studio-2022/"&gt;点击此处&lt;/a&gt;。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你一直通过单独的扩展在 Visual Studio 中使用 Azure MCP 工具，那你一定很熟悉这套流程——安装 VSIX、重启、祈祷别出问题、处理版本不匹配。这种摩擦现在消失了。&lt;/p&gt;
&lt;p&gt;Yun Jung Choi &lt;a href="https://devblogs.microsoft.com/visualstudio/azure-mcp-tools-now-ship-built-into-visual-studio-2022-no-extension-required/"&gt;宣布&lt;/a&gt;，Azure MCP 工具现在直接作为 Visual Studio 2022 中 Azure 开发工作负载的一部分发布。无需扩展，无需 VSIX，无需重启。&lt;/p&gt;
&lt;h2 id="这实际意味着什么"&gt;这实际意味着什么&lt;/h2&gt;
&lt;p&gt;从 Visual Studio 2022 版本 17.14.30 开始，Azure MCP Server 捆绑在 Azure 开发工作负载中。如果你已经安装了该工作负载，只需在 GitHub Copilot Chat 中启用它即可。&lt;/p&gt;
&lt;p&gt;超过 230 个工具，覆盖 45 项 Azure 服务——直接从聊天窗口即可访问。列出你的存储账户、部署 ASP.NET Core 应用、诊断 App Service 问题、查询 Log Analytics——全程无需打开浏览器标签页。&lt;/p&gt;
&lt;h2 id="为什么这比听起来更重要"&gt;为什么这比听起来更重要&lt;/h2&gt;
&lt;p&gt;开发工具有个道理：每多一个步骤就是摩擦，摩擦会扼杀采用率。MCP 作为单独的扩展意味着版本不匹配、安装失败，以及又多了一个需要保持更新的东西。将它内置到工作负载中意味着：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;单一的更新路径&lt;/strong&gt;——通过 Visual Studio Installer&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;无版本偏差&lt;/strong&gt;——扩展和 IDE 之间不会出现版本不一致&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;始终保持最新&lt;/strong&gt;——MCP Server 随 VS 常规发布一起更新&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对于标准化使用 Azure 的团队来说，这意义重大。安装一次工作负载，启用工具，每次会话都能使用。&lt;/p&gt;
&lt;h2 id="你能用它做什么"&gt;你能用它做什么&lt;/h2&gt;
&lt;p&gt;这些工具通过 Copilot Chat 覆盖完整的开发生命周期：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;学习&lt;/strong&gt;——询问 Azure 服务、最佳实践、架构模式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;设计与开发&lt;/strong&gt;——获取服务推荐，配置应用代码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;部署&lt;/strong&gt;——预配资源并直接从 IDE 进行部署&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;排查问题&lt;/strong&gt;——查询日志、检查资源健康状况、诊断生产环境问题&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一个简单的例子——在 Copilot Chat 中输入：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;List my storage accounts in my current subscription.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Copilot 在后台调用 Azure MCP 工具，查询你的订阅，返回一个包含名称、位置和 SKU 的格式化列表。无需打开门户。&lt;/p&gt;
&lt;h2 id="如何启用"&gt;如何启用&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;更新到 Visual Studio 2022 &lt;strong&gt;17.14.30&lt;/strong&gt; 或更高版本&lt;/li&gt;
&lt;li&gt;确保已安装 &lt;strong&gt;Azure development&lt;/strong&gt; 工作负载&lt;/li&gt;
&lt;li&gt;打开 GitHub Copilot Chat&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;Select tools&lt;/strong&gt; 按钮（双扳手图标）&lt;/li&gt;
&lt;li&gt;开启 &lt;strong&gt;Azure MCP Server&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;就这样。跨会话保持启用状态。&lt;/p&gt;
&lt;h2 id="一个注意事项"&gt;一个注意事项&lt;/h2&gt;
&lt;p&gt;这些工具默认是禁用的——你需要手动启用。而且 VS 2026 特有的工具在 VS 2022 中不可用。工具的可用性还取决于你的 Azure 订阅权限，与门户中一样。&lt;/p&gt;
&lt;h2 id="更大的图景"&gt;更大的图景&lt;/h2&gt;
&lt;p&gt;这是一个清晰趋势的一部分：MCP 正在成为在开发者 IDE 中呈现云工具的标准方式。我们已经看到了 &lt;a href="https://devblogs.microsoft.com/azure-sdk/announcing-azure-mcp-server-2-0-stable-release/"&gt;Azure MCP Server 2.0 稳定版发布&lt;/a&gt;以及在 VS Code 和其他编辑器中的 MCP 集成。将其内置到 Visual Studio 的工作负载系统中是自然而然的演进。&lt;/p&gt;
&lt;p&gt;对于我们这些常年在 Visual Studio 中工作的 .NET 开发者来说，这又少了一个需要切换到 Azure 门户的理由。说实话，标签页切换越少越好。&lt;/p&gt;</content:encoded></item><item><title>azd update — 一个命令搞定所有包管理器</title><link>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/azd-update-universal-upgrade-command/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/azd-update-universal-upgrade-command/</guid><description>Azure Developer CLI 现在有了一个通用的更新命令，无论你是通过 winget、Homebrew、Chocolatey 还是安装脚本安装的，都能正常工作。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;本文为自动翻译。查看原文请&lt;a href="https://thedotnetblog.com/zh/news/emiliano-montesdeoca/azd-update-universal-upgrade-command/"&gt;点击这里&lt;/a&gt;。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;你知道那个每隔几周就会弹出来的&amp;quot;azd 有新版本可用&amp;quot;提示吗？就是那个你总是忽略掉的，因为你根本想不起来当初是用 winget、Homebrew 还是半年前跑的那个 curl 脚本安装的 &lt;code&gt;azd&lt;/code&gt;。好了，这个问题终于解决了。&lt;/p&gt;
&lt;p&gt;Microsoft 刚刚发布了 &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-update/"&gt;&lt;code&gt;azd update&lt;/code&gt;&lt;/a&gt; — 一个命令就能将 Azure Developer CLI 更新到最新版本，不管你最初是怎么安装的。Windows、macOS、Linux — 都一样。就一个命令。&lt;/p&gt;
&lt;h2 id="工作原理"&gt;工作原理&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;就这么简单。如果你想提前体验新功能，可以切换到每日 Insiders 构建：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd update --channel daily
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd update --channel stable
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个命令会自动检测你当前的安装方式，并在后台使用对应的更新机制。再也不用纠结&amp;quot;等等，这台机器上我用的是 winget 还是 choco 来着？&amp;quot;&lt;/p&gt;
&lt;h2 id="一个小前提"&gt;一个小前提&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azd update&lt;/code&gt; 从版本 1.23.x 开始提供。如果你用的是更早的版本，需要用原来的安装方式做最后一次手动更新。之后，&lt;code&gt;azd update&lt;/code&gt; 就能接管一切了。&lt;/p&gt;
&lt;p&gt;用 &lt;code&gt;azd version&lt;/code&gt; 查看你当前的版本。如果需要全新安装，&lt;a href="https://learn.microsoft.com/azure/developer/azure-developer-cli/install-azd"&gt;安装文档&lt;/a&gt; 可以帮到你。&lt;/p&gt;
&lt;h2 id="为什么这很重要"&gt;为什么这很重要&lt;/h2&gt;
&lt;p&gt;这是一个小小的生活质量改善，但对于我们这些每天都在用 &lt;code&gt;azd&lt;/code&gt; 把 AI Agent 和 Aspire 应用部署到 Azure 的人来说，保持最新意味着更少的&amp;quot;这个 bug 在最新版本里已经修复了&amp;quot;的尴尬时刻。少操心一件事。&lt;/p&gt;
&lt;p&gt;阅读 &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-update/"&gt;完整公告&lt;/a&gt; 和 Jon Gallant 的 &lt;a href="https://blog.jongallant.com/2026/04/azd-update"&gt;深入分析&lt;/a&gt; 了解更多。&lt;/p&gt;</content:encoded></item><item><title>.NET Aspire 13.2想成为你AI智能体的好朋友</title><link>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/</guid><description>Aspire 13.2全力投入智能体开发 — 结构化CLI输出、隔离运行、自愈环境以及完整的OpenTelemetry数据，让你的AI智能体能够真正构建、运行和观察你的应用。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;本文为自动翻译。查看原文请&lt;a href="https://thedotnetblog.com/zh/news/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/"&gt;点击这里&lt;/a&gt;。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;你知道那种感觉吗？你的AI编码智能体写出了不错的代码，你很兴奋，然后当它试图&lt;em&gt;运行&lt;/em&gt;这个东西时一切都崩溃了？端口冲突、幽灵进程、错误的环境变量 — 突然你的智能体在排查启动问题上烧掉了大量token，而不是构建功能。&lt;/p&gt;
&lt;p&gt;Aspire团队刚刚发布了一篇关于这个问题的&lt;a href="https://devblogs.microsoft.com/aspire/agentic-dev-aspirations/"&gt;深思熟虑的文章&lt;/a&gt;，他们的答案很有说服力：Aspire 13.2的设计不仅面向人类，更面向AI智能体。&lt;/p&gt;
&lt;h2 id="问题是真实存在的"&gt;问题是真实存在的&lt;/h2&gt;
&lt;p&gt;AI智能体在写代码方面令人难以置信。但交付一个可工作的全栈应用涉及的远不止生成文件。你需要按正确的顺序启动服务、管理端口、设置环境变量、连接数据库，以及在出问题时获得反馈。目前，大多数智能体通过试错来处理所有这些 — 运行命令、读取错误输出、再试一次。&lt;/p&gt;
&lt;p&gt;我们叠加Markdown指令、自定义技能和提示来引导它们，但这些是不可预测的，无法编译，而且仅仅解析就要消耗token。Aspire团队抓住了核心洞察：智能体需要&lt;strong&gt;编译器和结构化API&lt;/strong&gt;，而不是更多的Markdown。&lt;/p&gt;
&lt;h2 id="aspire作为智能体基础设施"&gt;Aspire作为智能体基础设施&lt;/h2&gt;
&lt;p&gt;以下是Aspire 13.2为智能体开发带来的内容：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;整个技术栈用类型化代码描述。&lt;/strong&gt; AppHost用可编译的TypeScript或C#定义你的完整拓扑 — API、前端、数据库、缓存：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createBuilder&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;./.modules/aspire.js&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;createBuilder&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;postgres&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addPostgres&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;addDatabase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;catalog&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addRedis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;cache&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addNodeApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;api&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./api&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;src/index.ts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withHttpEndpoint&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;PORT&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;postgres&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addViteApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;waitFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;build&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;智能体可以读取这些来理解应用拓扑、添加资源、连接组件，并&lt;em&gt;通过构建来验证&lt;/em&gt;。编译器会立即告诉它哪里出了问题。不需要猜测，不需要在配置文件上反复试错。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一个命令统治所有。&lt;/strong&gt; 智能体不再需要在&lt;code&gt;docker compose up&lt;/code&gt;、&lt;code&gt;npm run dev&lt;/code&gt;和数据库启动脚本之间来回切换，一切只需&lt;code&gt;aspire start&lt;/code&gt;。所有资源按正确顺序、在正确的端口、用正确的配置启动。长时间运行的进程也不会挂起智能体 — Aspire负责管理它们。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;并行智能体的隔离模式。&lt;/strong&gt; 使用&lt;code&gt;--isolated&lt;/code&gt;，每次Aspire运行都会获得自己的随机端口和独立的用户密钥。多个智能体在git worktree中工作？它们不会冲突。这对于VS Code的后台智能体等创建并行环境的工具来说意义重大。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;通过遥测赋予智能体视野。&lt;/strong&gt; 这是真正强大的地方。Aspire CLI在开发期间暴露完整的OpenTelemetry数据 — 追踪、指标、结构化日志。你的智能体不是只读控制台输出然后祈祷一切顺利。它可以跨服务追踪失败的请求、分析慢端点，并精确定位问题所在。这是开发循环中的生产级可观察性。&lt;/p&gt;
&lt;h2 id="保龄球护栏类比"&gt;保龄球护栏类比&lt;/h2&gt;
&lt;p&gt;Aspire团队用了一个很棒的类比：把Aspire想象成AI智能体的保龄球道护栏。如果智能体不够完美（它确实不会完美），护栏会防止它打出沟球。技术栈定义防止配置错误，编译器捕获错误，CLI处理进程管理，遥测提供反馈循环。&lt;/p&gt;
&lt;p&gt;将此与Playwright CLI之类的工具结合，你的智能体就可以真正&lt;em&gt;使用&lt;/em&gt;你的应用 — 点击流程、检查DOM、在遥测中发现问题、修复代码、重启并重新测试。构建、运行、观察、修复。这就是我们一直追求的自主开发循环。&lt;/p&gt;
&lt;h2 id="入门"&gt;入门&lt;/h2&gt;
&lt;p&gt;Aspire新手？从&lt;a href="https://get.aspire.dev"&gt;get.aspire.dev&lt;/a&gt;安装CLI并遵循&lt;a href="https://aspire.dev/get-started/first-app"&gt;入门指南&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;已经在使用Aspire？运行&lt;code&gt;aspire update --self&lt;/code&gt;获取13.2，然后将你最喜欢的编码智能体指向你的仓库。有了Aspire的护栏，你可能会惊讶于它能走多远。&lt;/p&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;Aspire 13.2不再仅仅是一个分布式应用框架 — 它正在成为必不可少的智能体基础设施。结构化的技术栈定义、一键启动、隔离的并行运行和实时遥测，为AI智能体提供了从编写代码到交付应用所需的一切。&lt;/p&gt;
&lt;p&gt;阅读Aspire团队的&lt;a href="https://devblogs.microsoft.com/aspire/agentic-dev-aspirations/"&gt;完整文章&lt;/a&gt;获取所有细节和演示视频。&lt;/p&gt;</content:encoded></item><item><title>Aspire的隔离模式解决了并行开发中端口冲突的噩梦</title><link>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/aspire-isolated-mode-parallel-instances/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/aspire-isolated-mode-parallel-instances/</guid><description>Aspire 13.2引入--isolated模式：随机端口、独立密钥，运行同一AppHost的多个实例时零冲突。完美适用于AI智能体、worktree和并行工作流。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;本文为自动翻译。查看原文请&lt;a href="https://thedotnetblog.com/zh/news/emiliano-montesdeoca/aspire-isolated-mode-parallel-instances/"&gt;点击这里&lt;/a&gt;。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你曾试过同时运行同一个项目的两个实例，你就知道那种痛苦。端口8080已被占用。端口17370已被使用。杀掉进程、重启、摆弄环境变量 — 这是生产力杀手。&lt;/p&gt;
&lt;p&gt;这个问题在变得更严重，而不是更好。AI智能体创建git worktree来独立工作。后台智能体启动独立环境。开发者为了功能分支两次checkout同一个仓库。每一个场景都撞上了同一堵墙：同一个应用的两个实例在争夺相同的端口。&lt;/p&gt;
&lt;p&gt;Aspire 13.2用一个flag就解决了这个问题。Aspire团队的James Newton-King&lt;a href="https://devblogs.microsoft.com/aspire/aspire-isolated-mode-parallel-development/"&gt;写了完整的细节&lt;/a&gt;，这是那种&amp;quot;我们怎么之前没有这个&amp;quot;的功能。&lt;/p&gt;
&lt;h2 id="解决方案--isolated"&gt;解决方案：&lt;code&gt;--isolated&lt;/code&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire run --isolated
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;就这样。每次运行获得：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;随机端口&lt;/strong&gt; — 实例间不再冲突&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;隔离的用户密钥&lt;/strong&gt; — 连接字符串和API密钥在每个实例间保持独立&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不需要手动重新分配端口。不需要摆弄环境变量。每次运行自动获得一个干净的、无冲突的环境。&lt;/p&gt;
&lt;h2 id="这个功能发光的真实场景"&gt;这个功能发光的真实场景&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;多次checkout。&lt;/strong&gt; 你有一个功能分支在一个目录，一个bugfix在另一个：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Terminal 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/my-app-feature
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire run --isolated
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Terminal 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/my-app-bugfix
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire run --isolated
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;两个都无冲突运行。仪表盘显示什么在运行以及在哪里运行。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;VS Code中的后台智能体。&lt;/strong&gt; 当Copilot Chat的后台智能体创建git worktree来独立处理你的代码时，它可能需要运行你的Aspire AppHost。没有&lt;code&gt;--isolated&lt;/code&gt;，这就会和你的主worktree产生端口冲突。有了它，两个实例就能正常运行。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;aspire agent init&lt;/code&gt;附带的Aspire技能会自动指导智能体在worktree中工作时使用&lt;code&gt;--isolated&lt;/code&gt;。所以Copilot的后台智能体应该能原生处理这个问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;开发同时运行集成测试。&lt;/strong&gt; 需要在继续开发功能的同时对活跃的AppHost运行测试？隔离模式给每个上下文提供独立的端口和配置。&lt;/p&gt;
&lt;h2 id="底层工作原理"&gt;底层工作原理&lt;/h2&gt;
&lt;p&gt;当你传递&lt;code&gt;--isolated&lt;/code&gt;时，CLI会为该运行生成一个唯一的实例ID。这驱动两个行为：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;端口随机化&lt;/strong&gt; — 不再绑定到AppHost配置中定义的可预测端口，隔离模式为所有内容选择随机可用端口 — 仪表盘、服务端点，全部。服务发现自动调整，所以服务能找到彼此，不管它们落在哪个端口上。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;密钥隔离&lt;/strong&gt; — 每个隔离运行获得自己的用户密钥存储，以实例ID为键。一次运行的连接字符串和API密钥不会泄露到另一次运行中。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;你的代码不需要任何改动。Aspire的服务发现在运行时解析端点，所以不管端口分配如何，一切都能正确连接。&lt;/p&gt;
&lt;h2 id="何时使用"&gt;何时使用&lt;/h2&gt;
&lt;p&gt;当同时运行同一AppHost的多个实例时使用&lt;code&gt;--isolated&lt;/code&gt; — 无论是并行开发、自动化测试、AI智能体还是git worktree。对于偏好可预测端口的单实例开发，常规的&lt;code&gt;aspire run&lt;/code&gt;仍然可以正常使用。&lt;/p&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;隔离模式是一个解决真实且越来越常见问题的小功能。随着AI辅助开发推动我们走向更多并行工作流 — 多个智能体、多个worktree、多个上下文 — 能够简单地启动另一个实例而不必争夺端口是必不可少的。&lt;/p&gt;
&lt;p&gt;阅读&lt;a href="https://devblogs.microsoft.com/aspire/aspire-isolated-mode-parallel-development/"&gt;完整文章&lt;/a&gt;获取所有技术细节，并用&lt;code&gt;aspire update --self&lt;/code&gt;获取13.2来试用。&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.116 — Agents应用获得键盘导航和文件上下文补全</title><link>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/vscode-1-116-agents-app-updates/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/vscode-1-116-agents-app-updates/</guid><description>VS Code 1.116专注于Agents应用的优化 — 专属快捷键、辅助功能改进、文件上下文补全，以及CSS @import链接解析。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;本文为自动翻译。查看原文请&lt;a href="https://thedotnetblog.com/zh/news/emiliano-montesdeoca/vscode-1-116-agents-app-updates/"&gt;点击这里&lt;/a&gt;。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;VS Code 1.116是2026年4月的版本，虽然比最近的一些更新更轻量，但变化是有针对性且有意义的 — 尤其是如果你每天都在使用Agents应用。&lt;/p&gt;
&lt;p&gt;以下是基于&lt;a href="https://code.visualstudio.com/updates/v1_116"&gt;官方发行说明&lt;/a&gt;的更新内容。&lt;/p&gt;
&lt;h2 id="agents应用改进"&gt;Agents应用改进&lt;/h2&gt;
&lt;p&gt;Agents应用继续通过可用性优化不断成熟，这些改进在日常工作流中产生了真正的影响：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;专属快捷键&lt;/strong&gt; — 现在你可以用专属命令和键盘快捷键来聚焦更改视图、更改中的文件树，以及聊天自定义视图。如果你之前一直在Agents应用中到处点击来导航，这带来了完全由键盘驱动的工作流。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;辅助功能帮助对话框&lt;/strong&gt; — 在聊天输入框中按&lt;code&gt;Alt+F1&lt;/code&gt;现在会打开一个辅助功能帮助对话框，显示可用的命令和快捷键。屏幕阅读器用户还可以控制播报的详细程度。良好的辅助功能让每个人受益。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;文件上下文补全&lt;/strong&gt; — 在Agents应用聊天中输入&lt;code&gt;#&lt;/code&gt;来触发限定在当前工作区范围内的文件上下文补全。这是那些加速每次交互的小型生活质量改进之一 — 不再需要在引用代码时输入完整的文件路径。&lt;/p&gt;
&lt;h2 id="css-import链接解析"&gt;CSS &lt;code&gt;@import&lt;/code&gt;链接解析&lt;/h2&gt;
&lt;p&gt;前端开发者的好消息：VS Code现在可以解析使用node_modules路径的CSS &lt;code&gt;@import&lt;/code&gt;引用。当使用打包工具时，你可以通过&lt;code&gt;Ctrl+点击&lt;/code&gt;跳转到像&lt;code&gt;@import &amp;quot;some-module/style.css&amp;quot;&lt;/code&gt;这样的导入。虽小但消除了CSS工作流中的一个摩擦点。&lt;/p&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;VS Code 1.116是关于改进的 — 让Agents应用更易导航、更易访问、更友好的键盘操作。如果你在Agents应用中花费大量时间（我猜很多人都是如此），这些变化会累积起来。&lt;/p&gt;
&lt;p&gt;查看&lt;a href="https://code.visualstudio.com/updates/v1_116"&gt;完整发行说明&lt;/a&gt;获取完整列表。&lt;/p&gt;</content:encoded></item><item><title>那个你不知道的Visual Studio浮动窗口设置（但你应该知道）</title><link>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/visual-studio-floating-windows-powertoys/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/visual-studio-floating-windows-powertoys/</guid><description>Visual Studio的一个隐藏设置让你完全控制浮动窗口 — 独立的任务栏条目、正确的多显示器行为，以及完美的FancyZones集成。一个下拉菜单改变一切。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;本文为自动翻译。查看原文请&lt;a href="https://thedotnetblog.com/zh/news/emiliano-montesdeoca/visual-studio-floating-windows-powertoys/"&gt;点击这里&lt;/a&gt;。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你在Visual Studio中使用多个显示器（说实话，现在谁不用呢？），你可能经历过这种烦恼：浮动工具窗口在你最小化主IDE时消失，它们总是在所有窗口之上，而且不会在任务栏中显示为单独的按钮。这对某些工作流有效，但对多显示器设置来说很令人沮丧。&lt;/p&gt;
&lt;p&gt;Visual Studio团队的Mads Kristensen &lt;a href="https://devblogs.microsoft.com/visualstudio/take-full-control-of-your-floating-windows-in-visual-studio/"&gt;分享了一个鲜为人知的设置&lt;/a&gt;，它完全改变了浮动窗口的行为。一个下拉菜单。就这样。&lt;/p&gt;
&lt;h2 id="设置"&gt;设置&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Tools &amp;gt; Options &amp;gt; Environment &amp;gt; Windows &amp;gt; Floating Windows&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;下拉菜单&amp;quot;These floating windows are owned by the main window&amp;quot;有三个选项：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;None&lt;/strong&gt; — 完全独立。每个浮动窗口都有自己的任务栏条目，行为就像普通的Windows窗口。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool Windows&lt;/strong&gt;（默认）— 文档自由浮动，工具窗口保持与IDE绑定。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documents and Tool Windows&lt;/strong&gt; — 经典的Visual Studio行为，所有窗口都绑定到主窗口。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="为什么none是多显示器设置的最佳选择"&gt;为什么&amp;quot;None&amp;quot;是多显示器设置的最佳选择&lt;/h2&gt;
&lt;p&gt;将其设置为&lt;strong&gt;None&lt;/strong&gt;，突然间你所有的浮动工具窗口和文档都像真正的Windows应用程序一样运行。它们出现在任务栏中，当你最小化Visual Studio主窗口时保持可见，并且不再强制自己始终在最前面。&lt;/p&gt;
&lt;p&gt;将此与&lt;strong&gt;PowerToys FancyZones&lt;/strong&gt;结合使用，效果惊人。在你的显示器上创建自定义布局，将解决方案资源管理器放在一个区域，调试器放在另一个区域，代码文件放在你想要的任何地方。一切都保持在原位，一切都可以独立访问，你的工作空间感觉有条理而不是混乱的。&lt;/p&gt;
&lt;h2 id="快速建议"&gt;快速建议&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;多显示器高级用户&lt;/strong&gt;：设置为&lt;strong&gt;None&lt;/strong&gt;，搭配FancyZones&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;偶尔浮动的用户&lt;/strong&gt;：&lt;strong&gt;Tool Windows&lt;/strong&gt;（默认）是不错的折中方案&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;传统工作流&lt;/strong&gt;：&lt;strong&gt;Documents and Tool Windows&lt;/strong&gt;保持经典行为&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;专业提示：在任何工具窗口的标题栏上&lt;strong&gt;Ctrl + 双击&lt;/strong&gt;即可立即浮动或停靠。更改设置后无需重启。&lt;/p&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;这是那种&amp;quot;我不敢相信我之前不知道&amp;quot;的设置之一。如果Visual Studio中的浮动窗口曾经让你烦恼，现在就去改掉它。&lt;/p&gt;
&lt;p&gt;阅读&lt;a href="https://devblogs.microsoft.com/visualstudio/take-full-control-of-your-floating-windows-in-visual-studio/"&gt;完整文章&lt;/a&gt;获取详细信息和截图。&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.115 — 后台终端通知、SSH Agent 模式及更多</title><link>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/vscode-1-115-agent-improvements/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/vscode-1-115-agent-improvements/</guid><description>VS Code 1.115 带来了面向 Agent 的后台终端通知、SSH 远程 Agent 托管、终端文件粘贴以及会话感知的编辑追踪。以下是对 .NET 开发者重要的内容。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;本文为自动翻译。如需查看原文，&lt;a href="https://thedotnetblog.com/zh/news/emiliano-montesdeoca/vscode-1-115-agent-improvements/"&gt;请点击这里&lt;/a&gt;。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;VS Code 1.115 刚刚&lt;a href="https://code.visualstudio.com/updates/v1_115"&gt;发布&lt;/a&gt;了，虽然从主要功能来看这是一个较轻量的版本，但如果你每天都在使用 AI 编程助手，那么与 Agent 相关的改进确实非常实用。&lt;/p&gt;
&lt;p&gt;让我来重点介绍一下真正值得了解的内容。&lt;/p&gt;
&lt;h2 id="后台终端与-agent-通信"&gt;后台终端与 Agent 通信&lt;/h2&gt;
&lt;p&gt;这是本次最突出的功能。后台终端现在会在命令完成时自动通知 Agent，包括退出代码和终端输出。后台终端中的输入提示也会被检测并展示给用户。&lt;/p&gt;
&lt;p&gt;这为什么重要？如果你用过 Copilot 的 Agent 模式在后台运行构建命令或测试套件，你肯定知道&amp;quot;那个跑完了没？&amp;ldquo;的痛苦——后台终端基本上就是发射后不管。现在 Agent 会在你的 &lt;code&gt;dotnet build&lt;/code&gt; 或 &lt;code&gt;dotnet test&lt;/code&gt; 完成时收到通知，看到输出，并相应地做出反应。这是一个小改动，但让 Agent 驱动的工作流程变得更加可靠。&lt;/p&gt;
&lt;p&gt;还有一个新的 &lt;code&gt;send_to_terminal&lt;/code&gt; 工具，允许 Agent 在用户确认后向后台终端发送命令，解决了 &lt;code&gt;run_in_terminal&lt;/code&gt; 带超时参数时会将终端移到后台并使其变为只读的问题。&lt;/p&gt;
&lt;h2 id="ssh-远程-agent-托管"&gt;SSH 远程 Agent 托管&lt;/h2&gt;
&lt;p&gt;VS Code 现在支持通过 SSH 连接到远程机器，自动安装 CLI 并以 Agent 主机模式启动。这意味着你的 AI Agent 会话可以直接针对远程环境——对于在 Linux 服务器或云虚拟机上构建和测试的 .NET 开发者来说非常有用。&lt;/p&gt;
&lt;h2 id="agent-会话中的编辑追踪"&gt;Agent 会话中的编辑追踪&lt;/h2&gt;
&lt;p&gt;Agent 会话期间进行的文件编辑现在会被追踪和恢复，支持差异对比、撤销/重做和状态恢复。如果 Agent 修改了你的代码并且出了问题，你可以准确地看到哪些内容发生了变化并将其回滚。让 Agent 修改代码库时更加安心。&lt;/p&gt;
&lt;h2 id="浏览器标签页感知及其他改进"&gt;浏览器标签页感知及其他改进&lt;/h2&gt;
&lt;p&gt;还有一些生活质量方面的提升：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;浏览器标签页追踪&lt;/strong&gt; — 聊天现在可以追踪和链接会话期间打开的浏览器标签页，这样 Agent 可以引用你正在查看的网页&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;终端文件粘贴&lt;/strong&gt; — 使用 Ctrl+V、拖放或右键点击将文件（包括图片）粘贴到终端&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;小地图中的测试覆盖率&lt;/strong&gt; — 测试覆盖率指示器现在显示在小地图中，提供快速的视觉概览&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mac 上的双指缩放&lt;/strong&gt; — 集成浏览器支持双指缩放手势&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;会话中的 Copilot 使用权限&lt;/strong&gt; — 状态栏在会话视图中显示使用信息&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;转到文件中的网站图标&lt;/strong&gt; — 打开的网页在快速选择列表中显示网站图标&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;VS Code 1.115 是一个渐进式版本，但 Agent 改进——后台终端通知、SSH Agent 托管和编辑追踪——加在一起为 AI 辅助开发带来了明显更流畅的体验。如果你在 .NET 项目中使用 Copilot 的 Agent 模式，这些正是每天减少摩擦的生活质量改进。&lt;/p&gt;
&lt;p&gt;查看&lt;a href="https://code.visualstudio.com/updates/v1_115"&gt;完整的发行说明&lt;/a&gt;了解所有细节。&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.2 自带文档 CLI — 你的 AI 代理也能用</title><link>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/aspire-docs-cli-ai-skills/</link><pubDate>Sat, 04 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/aspire-docs-cli-ai-skills/</guid><description>.NET Aspire 13.2 新增了 aspire docs — 一个无需离开终端即可搜索、浏览和阅读官方文档的 CLI。它也可以作为 AI 代理的工具。这就是为什么这很重要。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;本文为自动翻译。查看原文请&lt;a href="https://thedotnetblog.com/zh/news/emiliano-montesdeoca/aspire-docs-cli-ai-skills/"&gt;点击此处&lt;/a&gt;。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;你知道那种时刻吗——你正深入一个 Aspire AppHost，接入各种集成，然后需要确认 Redis 集成到底需要哪些参数？你 Alt-Tab 切到浏览器，在 aspire.dev 上翻来翻去，眯着眼看 API 文档，然后切回编辑器。上下文没了，心流断了。&lt;/p&gt;
&lt;p&gt;Aspire 13.2 刚刚&lt;a href="https://devblogs.microsoft.com/aspire/aspire-docs-in-your-terminal/"&gt;发布了解决方案&lt;/a&gt;。&lt;code&gt;aspire docs&lt;/code&gt; CLI 让你直接从终端搜索、浏览和阅读 Aspire 官方文档。而且因为它由可复用的服务支撑，AI 代理和技能可以使用同样的命令来查找文档，而不是幻想出不存在的 API。&lt;/p&gt;
&lt;h2 id="这到底解决了什么问题"&gt;这到底解决了什么问题&lt;/h2&gt;
&lt;p&gt;David Pine 在原文中说得很到位：AI 代理在帮助开发者构建 Aspire 应用方面&lt;em&gt;糟糕透了&lt;/em&gt;。它们推荐 &lt;code&gt;dotnet run&lt;/code&gt; 而不是 &lt;code&gt;aspire run&lt;/code&gt;，引用 learn.microsoft.com 来查找实际在 aspire.dev 上的文档，建议过时的 NuGet 包，还有——我个人最喜欢的——幻想出根本不存在的 API。&lt;/p&gt;
&lt;p&gt;为什么？因为 Aspire 作为 .NET 专属工具的时间远比它成为多语言工具的时间长，而且 LLM 使用的训练数据早于最新功能。当你给 AI 代理真正查找当前文档的能力时，它就不再猜测，开始变得有用了。&lt;/p&gt;
&lt;h2 id="三个命令零个浏览器标签页"&gt;三个命令，零个浏览器标签页&lt;/h2&gt;
&lt;p&gt;CLI 简洁得令人耳目一新：&lt;/p&gt;
&lt;h3 id="列出所有文档"&gt;列出所有文档&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;返回 aspire.dev 上所有可用的文档页面。需要机器可读的输出？加上 &lt;code&gt;--format Json&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id="搜索主题"&gt;搜索主题&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs search &lt;span class="s2"&gt;&amp;#34;redis&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;同时搜索标题和内容，使用加权相关性评分。与内部驱动文档工具的搜索引擎完全一样。你会得到带有标题、slug 和相关性分数的排名结果。&lt;/p&gt;
&lt;h3 id="阅读完整页面或仅一个章节"&gt;阅读完整页面（或仅一个章节）&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs get redis-integration
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;将完整页面以 markdown 格式流式传输到你的终端。只需要一个章节？&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs get redis-integration --section &lt;span class="s2"&gt;&amp;#34;Add Redis resource&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;精准定位。不用滚动 500 行。只看你需要的部分。&lt;/p&gt;
&lt;h2 id="ai-代理的视角"&gt;AI 代理的视角&lt;/h2&gt;
&lt;p&gt;对于我们这些使用 AI 工具进行开发的人来说，这才是真正有趣的地方。同样的 &lt;code&gt;aspire docs&lt;/code&gt; 命令可以作为 AI 代理的工具——通过技能、MCP 服务器或简单的 CLI 封装。&lt;/p&gt;
&lt;p&gt;你的 AI 助手不再根据过时的训练数据编造 Aspire API，而是可以调用 &lt;code&gt;aspire docs search &amp;quot;postgres&amp;quot;&lt;/code&gt;，找到官方集成文档，阅读正确的页面，给你文档记录的方案。实时的、最新的文档——而不是模型六个月前记住的内容。&lt;/p&gt;
&lt;p&gt;背后的架构是有意为之的。Aspire 团队构建了可复用的服务（&lt;code&gt;IDocsIndexService&lt;/code&gt;、&lt;code&gt;IDocsSearchService&lt;/code&gt;、&lt;code&gt;IDocsFetcher&lt;/code&gt;、&lt;code&gt;IDocsCache&lt;/code&gt;），而不是一次性集成。这意味着同一个搜索引擎为终端中的人类、编辑器中的 AI 代理以及 CI 流水线中的自动化服务。&lt;/p&gt;
&lt;h2 id="真实场景"&gt;真实场景&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;终端快速查询：&lt;/strong&gt; 你已经深入到第三个文件，需要 Redis 配置参数。两个命令，九十秒，回去干活：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs search &lt;span class="s2"&gt;&amp;#34;redis&amp;#34;&lt;/span&gt; --limit &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs get redis-integration --section &lt;span class="s2"&gt;&amp;#34;Configuration&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;AI 辅助开发：&lt;/strong&gt; 你的 VS Code 技能封装了 CLI 命令。你问&amp;quot;给我的 AppHost 添加一个 PostgreSQL 数据库&amp;quot;，代理在回答之前先查阅真实文档。没有幻觉。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CI/CD 验证：&lt;/strong&gt; 你的流水线以编程方式根据官方文档验证 AppHost 配置。&lt;code&gt;--format Json&lt;/code&gt; 输出可以干净地通过管道传递给 &lt;code&gt;jq&lt;/code&gt; 和其他工具。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自定义知识库：&lt;/strong&gt; 在构建自己的 AI 工具？将结构化 JSON 输出直接导入你的知识库：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs search &lt;span class="s2"&gt;&amp;#34;monitoring&amp;#34;&lt;/span&gt; --format Json &lt;span class="p"&gt;|&lt;/span&gt; jq &lt;span class="s1"&gt;&amp;#39;[.[] | {slug, title, summary}]&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;不需要网页抓取。不需要 API 密钥。与文档工具内部使用的完全一样的结构化数据。&lt;/p&gt;
&lt;h2 id="文档始终是最新的"&gt;文档始终是最新的&lt;/h2&gt;
&lt;p&gt;这是我最欣赏的部分。CLI 不会下载快照——它通过基于 ETag 的缓存查询 aspire.dev。文档一旦更新，你的 CLI 和构建在其之上的所有技能都会反映出来。没有过时的副本，没有&amp;quot;但是 wiki 上说的是&amp;hellip;&amp;ldquo;的尴尬时刻。&lt;/p&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;aspire docs&lt;/code&gt; 是那种以简洁方式解决真实问题的小功能之一。人类获得了终端原生的文档访问。AI 代理获得了停止猜测、开始引用真实文档的方式。而且一切都由同一个事实来源支撑。&lt;/p&gt;
&lt;p&gt;如果你正在使用 .NET Aspire 开发，还没试过这个 CLI，运行 &lt;code&gt;aspire docs search &amp;quot;你的主题&amp;quot;&lt;/code&gt; 看看感觉如何。然后考虑将这些命令封装到你正在使用的任何 AI 技能或自动化设置中——你的代理会感谢你的。&lt;/p&gt;
&lt;p&gt;查看 &lt;a href="https://davidpine.dev/posts/aspire-docs-mcp-tools/"&gt;David Pine 的深入分析&lt;/a&gt;了解文档工具是如何构建的，以及&lt;a href="https://aspire.dev/reference/cli/commands/aspire-docs/"&gt;官方 CLI 参考&lt;/a&gt;获取所有细节。&lt;/p&gt;</content:encoded></item><item><title>azd现在可以在本地运行和调试AI代理了 — 2026年3月都有哪些变化</title><link>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/</guid><description>Azure Developer CLI在2026年3月发布了七个版本。亮点：AI代理的本地运行和调试循环、GitHub Copilot项目设置集成、Container App Jobs支持。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;本文为自动翻译。查看原始版本，请&lt;a href="https://thedotnetblog.com/zh/news/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/"&gt;点击这里&lt;/a&gt;。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;一个月七个版本。这是Azure Developer CLI (&lt;code&gt;azd&lt;/code&gt;) 团队在2026年3月发布的成果，而头条功能正是我一直在等的：&lt;strong&gt;AI代理的本地运行和调试循环&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;PC Chan &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-march-2026/"&gt;发布了完整摘要&lt;/a&gt;，虽然内容很多，但让我筛选出对构建AI驱动应用的.NET开发者真正重要的部分。&lt;/p&gt;
&lt;h2 id="不用部署就能运行和调试ai代理"&gt;不用部署就能运行和调试AI代理&lt;/h2&gt;
&lt;p&gt;这是最大的亮点。新的 &lt;code&gt;azure.ai.agents&lt;/code&gt; 扩展添加了一组命令，为AI代理提供了完整的内循环体验：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;azd ai agent run&lt;/code&gt; — 在本地启动你的代理&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent invoke&lt;/code&gt; — 向其发送消息（本地或已部署的）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent show&lt;/code&gt; — 显示容器状态和健康状况&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent monitor&lt;/code&gt; — 实时流式传输容器日志&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以前，测试AI代理意味着每次修改都要部署到Microsoft Foundry。现在你可以在本地迭代，测试代理行为，准备好了再部署。&lt;/p&gt;
&lt;h2 id="github-copilot为你配置azd项目"&gt;GitHub Copilot为你配置azd项目&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azd init&lt;/code&gt; 现在提供了&amp;quot;Set up with GitHub Copilot (Preview)&amp;ldquo;选项。无需手动回答关于项目结构的提示，Copilot代理为你生成配置。当命令失败时，&lt;code&gt;azd&lt;/code&gt; 提供AI辅助的问题排查——全程不需要离开终端。&lt;/p&gt;
&lt;h2 id="container-app-jobs和部署改进"&gt;Container App Jobs和部署改进&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Container App Jobs&lt;/strong&gt;：&lt;code&gt;azd&lt;/code&gt;现在通过现有的&lt;code&gt;host: containerapp&lt;/code&gt;配置部署&lt;code&gt;Microsoft.App/jobs&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可配置的部署超时&lt;/strong&gt;：&lt;code&gt;azd deploy&lt;/code&gt;的新&lt;code&gt;--timeout&lt;/code&gt;标志和&lt;code&gt;azure.yaml&lt;/code&gt;中的&lt;code&gt;deployTimeout&lt;/code&gt;字段。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;远程构建回退&lt;/strong&gt;：当ACR构建失败时，&lt;code&gt;azd&lt;/code&gt;自动回退到本地Docker/Podman构建。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本地预检验证&lt;/strong&gt;：部署前在本地验证Bicep参数。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="开发体验改进"&gt;开发体验改进&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;自动检测pnpm/yarn&lt;/strong&gt; — JS/TS项目&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pyproject.toml支持&lt;/strong&gt; — Python打包&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本地模板目录&lt;/strong&gt; — &lt;code&gt;azd init --template&lt;/code&gt;接受文件系统路径&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更好的错误消息&lt;/strong&gt; — &lt;code&gt;--no-prompt&lt;/code&gt;模式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;构建环境变量&lt;/strong&gt; — 注入到所有框架构建子进程（.NET、Node.js、Java、Python）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;本地AI代理调试循环是这个版本的明星，但部署改进和DX优化的积累使&lt;code&gt;azd&lt;/code&gt;比以往更加成熟。如果你在Azure上部署.NET应用——特别是AI代理——这次更新值得关注。&lt;/p&gt;
&lt;p&gt;查看&lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-march-2026/"&gt;完整发行说明&lt;/a&gt;了解所有细节。&lt;/p&gt;</content:encoded></item><item><title>Azure DevOps终于修好了所有人都在抱怨的Markdown编辑器</title><link>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/azure-devops-markdown-editor-work-items/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/azure-devops-markdown-editor-work-items/</guid><description>Azure DevOps的工作项Markdown编辑器获得了更清晰的预览与编辑模式区分。一个小改动，却解决了一个真正恼人的工作流问题。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;本文为自动翻译。查看原始版本，请&lt;a href="https://thedotnetblog.com/zh/news/emiliano-montesdeoca/azure-devops-markdown-editor-work-items/"&gt;点击这里&lt;/a&gt;。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你使用Azure Boards，你可能经历过这种情况：你在阅读一个工作项描述，也许在检查验收标准，然后不小心双击了。砰——你进入了编辑模式。你根本不想编辑任何东西。你只是在阅读。&lt;/p&gt;
&lt;p&gt;Dan Hellem &lt;a href="https://devblogs.microsoft.com/devops/improving-the-markdown-editor-for-work-items/"&gt;宣布了这个修复&lt;/a&gt;，这是那种听起来很小但确实从日常工作流中消除了真正摩擦的改动。&lt;/p&gt;
&lt;h2 id="什么变了"&gt;什么变了&lt;/h2&gt;
&lt;p&gt;工作项文本字段的Markdown编辑器现在&lt;strong&gt;默认以预览模式打开&lt;/strong&gt;。你可以阅读和交互内容——跟随链接、检查格式——不用担心意外进入编辑模式。&lt;/p&gt;
&lt;p&gt;当你真的想要编辑时，点击字段顶部的编辑图标。完成后，显式退出到预览模式。简单、有意图、可预测。&lt;/p&gt;
&lt;h2 id="为什么这比听起来更重要"&gt;为什么这比听起来更重要&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://developercommunity.visualstudio.com/t/Markdown-editor-for-work-item-multi-line/10935496"&gt;社区反馈帖子&lt;/a&gt;很长。双击编辑的行为是在2025年7月随Markdown编辑器引入的，投诉几乎立刻开始了。&lt;/p&gt;
&lt;p&gt;对于使用Azure Boards进行冲刺计划、需求梳理或代码审查的团队来说，这种微摩擦会累积。&lt;/p&gt;
&lt;h2 id="部署状态"&gt;部署状态&lt;/h2&gt;
&lt;p&gt;已经在向部分客户推出，将在未来两到三周内扩展到所有人。&lt;/p&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;不是每个改进都需要成为头条功能。有时候最好的更新就是简单地移除恼人的东西。这就是其中之一——一个小小的UX修复，让Azure Boards对只想安静阅读工作项的人变得不再那么敌意。&lt;/p&gt;</content:encoded></item><item><title>Bookmark Studio为Visual Studio书签带来基于槽位的导航和分享功能</title><link>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/bookmark-studio-visual-studio-extension/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/bookmark-studio-visual-studio-extension/</guid><description>Mads Kristensen的新Bookmark Studio扩展为Visual Studio书签添加了键盘驱动的槽位导航、书签管理器、颜色、标签和导出功能。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;本文为自动翻译。查看原始版本，请&lt;a href="https://thedotnetblog.com/zh/news/emiliano-montesdeoca/bookmark-studio-visual-studio-extension/"&gt;点击这里&lt;/a&gt;。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Visual Studio中的书签一直&amp;hellip;还行。你设置一个，导航到下一个，然后忘记哪个是哪个。它们能用，但从来不是你会称之为强大的功能。&lt;/p&gt;
&lt;p&gt;Mads Kristensen刚刚&lt;a href="https://devblogs.microsoft.com/visualstudio/bookmark-studio-evolving-bookmarks-in-visual-studio/"&gt;发布了Bookmark Studio&lt;/a&gt;，一个实验性扩展，精确填补了你可能遇到的空缺。&lt;/p&gt;
&lt;h2 id="基于槽位的导航"&gt;基于槽位的导航&lt;/h2&gt;
&lt;p&gt;书签可以分配到1-9号槽位，通过&lt;code&gt;Alt+Shift+1&lt;/code&gt;到&lt;code&gt;Alt+Shift+9&lt;/code&gt;直接跳转。新书签自动获得下一个可用槽位。&lt;/p&gt;
&lt;h2 id="书签管理器"&gt;书签管理器&lt;/h2&gt;
&lt;p&gt;新的工具窗口在一个地方显示所有书签，支持按名称、文件、位置、颜色或槽位过滤。&lt;/p&gt;
&lt;h2 id="用标签颜色和文件夹组织"&gt;用标签、颜色和文件夹组织&lt;/h2&gt;
&lt;p&gt;书签可以有标签、颜色，并分组到文件夹中。元数据按解决方案存储。&lt;/p&gt;
&lt;h2 id="导出和分享"&gt;导出和分享&lt;/h2&gt;
&lt;p&gt;Bookmark Studio允许将书签导出为纯文本、Markdown或CSV。&lt;/p&gt;
&lt;h2 id="跟随代码移动的书签"&gt;跟随代码移动的书签&lt;/h2&gt;
&lt;p&gt;Bookmark Studio相对于锚定的文本跟踪书签，所以编辑时不会漂移到错误的行。&lt;/p&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;Bookmark Studio没有重新发明任何东西。它把一个多年来&amp;quot;够用&amp;quot;的功能变得真正有用。从&lt;a href="https://marketplace.visualstudio.com/items?itemName=MadsKristensen.BookmarkStudio"&gt;Visual Studio Marketplace&lt;/a&gt;下载吧。&lt;/p&gt;</content:encoded></item><item><title>Visual Studio 3月更新允许构建自定义Copilot代理 — find_symbol是一大亮点</title><link>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/</guid><description>Visual Studio 2026年3月更新带来了自定义Copilot代理、可复用的代理技能、语言感知的find_symbol工具、以及从Test Explorer进行的Copilot性能分析。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;本文为自动翻译。查看原始版本，请&lt;a href="https://thedotnetblog.com/zh/news/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/"&gt;点击这里&lt;/a&gt;。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Visual Studio刚刚获得了最重要的Copilot更新。Mark Downie &lt;a href="https://devblogs.microsoft.com/visualstudio/visual-studio-march-update-build-your-own-custom-agents/"&gt;发布了3月版本&lt;/a&gt;，标题是自定义代理——但说实话，&lt;code&gt;find_symbol&lt;/code&gt;工具可能才是最能改变你工作流的功能。&lt;/p&gt;
&lt;h2 id="仓库中的自定义copilot代理"&gt;仓库中的自定义Copilot代理&lt;/h2&gt;
&lt;p&gt;想让Copilot遵循你团队的编码标准？自定义代理定义为&lt;code&gt;.github/agents/&lt;/code&gt;中的&lt;code&gt;.agent.md&lt;/code&gt;文件。每个代理都有完整的工作区感知、代码理解、工具、首选模型和MCP连接访问权限。&lt;/p&gt;
&lt;h2 id="代理技能可复用的指令包"&gt;代理技能：可复用的指令包&lt;/h2&gt;
&lt;p&gt;技能从仓库的&lt;code&gt;.github/skills/&lt;/code&gt;或个人资料的&lt;code&gt;~/.copilot/skills/&lt;/code&gt;自动加载。&lt;/p&gt;
&lt;h2 id="find_symbol语言感知导航"&gt;find_symbol：语言感知导航&lt;/h2&gt;
&lt;p&gt;新的&lt;code&gt;find_symbol&lt;/code&gt;工具为Copilot的代理模式提供了基于语言服务的符号导航。代理不再搜索文本，而是可以找到符号的所有引用并访问类型信息和作用域。&lt;/p&gt;
&lt;p&gt;对于.NET开发者来说这是巨大改进——拥有深层类型层次结构的C#代码库受益匪浅。&lt;/p&gt;
&lt;h2 id="用copilot分析测试性能"&gt;用Copilot分析测试性能&lt;/h2&gt;
&lt;p&gt;Test Explorer上下文菜单中新增了&lt;strong&gt;Profile with Copilot&lt;/strong&gt;。Profiling Agent自动运行测试并分析性能。&lt;/p&gt;
&lt;h2 id="实时调试中的perf-tips"&gt;实时调试中的Perf Tips&lt;/h2&gt;
&lt;p&gt;性能优化现在在调试过程中进行。Visual Studio内联显示执行时间。看到慢的行？点击Perf Tip向Copilot请求优化建议。&lt;/p&gt;
&lt;h2 id="从solution-explorer修复nuget漏洞"&gt;从Solution Explorer修复NuGet漏洞&lt;/h2&gt;
&lt;p&gt;当检测到NuGet包漏洞时，Solution Explorer中直接显示&lt;strong&gt;Fix with GitHub Copilot&lt;/strong&gt;链接。&lt;/p&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;自定义代理和技能是标题，但&lt;code&gt;find_symbol&lt;/code&gt;是隐藏的亮点——它从根本上改变了Copilot重构.NET代码时的准确性。下载&lt;a href="https://visualstudio.microsoft.com/downloads/"&gt;Visual Studio 2026 Insiders&lt;/a&gt;来体验所有新功能。&lt;/p&gt;</content:encoded></item><item><title>从笔记本到生产：用两个命令将 AI 代理部署到 Microsoft Foundry</title><link>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/deploy-ai-agents-foundry-azd-two-commands/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/deploy-ai-agents-foundry-azd-two-commands/</guid><description>Azure Developer CLI 现在有了 'azd ai agent' 命令，可以在几分钟内将你的 AI 代理从本地开发带到 Foundry 的生产端点。这是完整的工作流程。</description><content:encoded>&lt;p&gt;你知道&amp;quot;在我的机器上能跑&amp;quot;和&amp;quot;已部署并正在处理流量&amp;quot;之间的鸿沟吗？对于 AI 代理来说，这个鸿沟一直痛苦地大。你需要配置资源、部署模型、配置身份、设置监控 — 这些都是在任何人能实际调用你的代理之前要做的。&lt;/p&gt;
&lt;p&gt;Azure Developer CLI 刚刚把这变成了&lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-ai-agent-end-to-end/"&gt;两个命令的事&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id="新的-azd-ai-agent-工作流"&gt;新的 &lt;code&gt;azd ai agent&lt;/code&gt; 工作流&lt;/h2&gt;
&lt;p&gt;让我带你看看这实际是什么样子。你有一个 AI 代理项目 — 比如说一个酒店礼宾代理。它在本地运行正常。你想让它在 Microsoft Foundry 上运行。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd ai agent init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;就这样。两个命令。&lt;code&gt;azd ai agent init&lt;/code&gt; 在你的仓库中生成基础设施即代码，&lt;code&gt;azd up&lt;/code&gt; 在 Azure 上配置一切并发布你的代理。你会得到一个直接指向 Foundry 门户中你的代理的链接。&lt;/p&gt;
&lt;h2 id="底层发生了什么"&gt;底层发生了什么&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;init&lt;/code&gt; 命令在你的仓库中生成真实的、可检查的 Bicep 模板：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个 &lt;strong&gt;Foundry Resource&lt;/strong&gt;（顶层容器）&lt;/li&gt;
&lt;li&gt;一个 &lt;strong&gt;Foundry Project&lt;/strong&gt;（你的代理所在的地方）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模型部署&lt;/strong&gt;配置（GPT-4o 等）&lt;/li&gt;
&lt;li&gt;带有适当 RBAC 角色分配的&lt;strong&gt;托管身份&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;服务映射用的 &lt;code&gt;azure.yaml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;带有代理元数据和环境变量的 &lt;code&gt;agent.yaml&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;关键是：这一切都是你的。它是仓库中的版本化 Bicep。你可以检查它、自定义它，并与你的代理代码一起提交。没有魔法黑盒。&lt;/p&gt;
&lt;h2 id="开发内循环"&gt;开发内循环&lt;/h2&gt;
&lt;p&gt;我真正喜欢的是本地开发体验。当你在迭代代理逻辑时，不想每次改变提示词都重新部署：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd ai agent run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这会在本地启动你的代理。配合 &lt;code&gt;azd ai agent invoke&lt;/code&gt; 发送测试提示，你就有了一个紧密的反馈循环。编辑代码、重启、调用、重复。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;invoke&lt;/code&gt; 命令的路由也很智能 — 当本地代理在运行时，它会自动指向本地。不在运行时，指向远程端点。&lt;/p&gt;
&lt;h2 id="实时监控"&gt;实时监控&lt;/h2&gt;
&lt;p&gt;这是说服我的功能。一旦你的代理部署完成：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd ai agent monitor --follow
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;流经你的代理的每个请求和响应都会实时传输到你的终端。对于调试生产问题，这是无价之宝。不用挖 Log Analytics，不用等指标聚合 — 你看到的就是现在正在发生的事情。&lt;/p&gt;
&lt;h2 id="完整的命令集"&gt;完整的命令集&lt;/h2&gt;
&lt;p&gt;快速参考：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;命令&lt;/th&gt;
&lt;th&gt;功能&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent init&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;用 IaC 搭建 Foundry 代理项目&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd up&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;配置 Azure 资源并部署代理&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent invoke&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;向远程或本地代理发送提示&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent run&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;在本地运行代理用于开发&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent monitor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;从已发布的代理流式传输实时日志&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent show&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;检查代理健康状态和状态&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd down&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;清理所有 Azure 资源&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="为什么这对-net-开发者重要"&gt;为什么这对 .NET 开发者重要&lt;/h2&gt;
&lt;p&gt;虽然公告中的示例是基于 Python 的，但基础设施的故事是语言无关的。你的 .NET 代理得到相同的 Bicep 脚手架、相同的托管身份设置、相同的监控管道。如果你已经在用 &lt;code&gt;azd&lt;/code&gt; 部署 .NET Aspire 应用或 Azure 部署，这直接融入你现有的工作流。&lt;/p&gt;
&lt;p&gt;AI 代理的部署鸿沟一直是生态系统中最大的摩擦点之一。从一个工作原型到一个具有适当身份、网络和监控的生产端点，不应该需要一周的 DevOps 工作。现在只需要两个命令和几分钟。&lt;/p&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azd ai agent&lt;/code&gt; 现在可用。如果你一直因为基础设施设置看起来工作量太大而推迟部署 AI 代理，试试看。查看&lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-ai-agent-end-to-end/"&gt;完整教程&lt;/a&gt;获取包括前端聊天应用集成在内的完整步骤。&lt;/p&gt;</content:encoded></item></channel></rss>