.NET中文官方博客
免费、 跨平台、 开源。一个用于构建所有应用程序的开发人员平台
Latest posts
Bing 性能是如何跟随 .NET 一起迭代的?
本文翻译于Ben Watson的这篇英文文章:Migration of Bing’s Workflow Engine to .NET 5 - .NET Blog (microsoft.com) 大约两年前,我发表了一篇文章,详细的介绍了Bing的中央工作流引擎(XAP)从.NET Framework升级到.net 5的过程。你可以通过这篇文章来了解XAP的工作原理,以及它在Bing全局中的位置。 从那时起,XAP一直是微软许多搜索和工作流相关技术的关键组件,并在新的集成中发挥了核心作用,比如新的AI驱动的Bing。 人们对功能和性能的期望越来越高,这意味着我们对.NET作为基础设施的关键部分的依赖性越来越深。 在过去的两年里,我们是.net 6和.net 7的早期采用者,现在我们正将目光转向.net 8。我们发现每个版本都比上一个版本更容易升级。作为一个核心平台团队,我们对每个版本的 .NET 带来的性能提升和新功能都充满了强烈的动力。通过积极地测试和升级到最新版本,并向.net团队提供反馈,我们也可以影响到他们的计划。这样每个人都会受益。 本文将重点介绍我们所做的一些主要更新和挑战,以及我们在积极跟进最新 .NET 版本时最终取得的胜利。 Hybrid No-More 正如上一篇文章中提到的,当我们第一次升级到.net 5时,我们是在一个混合模型中进行的,其中我们仍然是基于.net F...
更新WinForm’s InitializeComponent的现代代码生成
本文翻译于Klaus Loeffelmann的这篇英文文章:Updated Modern Code Generation for WinForm's InitializeComponent - .NET Blog (microsoft.com) 当你使用Visual Studio中的WinForms Designer来创建一个WinForms表单或用户控件时,它并没有像XML或HTML那样的特殊定义或文件格式来表示用户界面。从一开始,WinForms使用的唯一格式就是程序代码。在WinForms Visual Basic项目中定义的表单或用户控件会被保存到VB代码中。在c#项目中,这就是c#代码。这些代码将被放置在一个专用的Designer文件中,该文件位于实际表单代码文件后面,也包含控制UI的代码。 当你的表单或用户控件需要在WinForms Designer中再次打开时,该代码将被解释并根据结果对象图– 在Designer中重新创建表单/用户控件。这就是我们把保存表单的过程称为CodeDOM序列化的原因。这里的CodeDOM指的是一种对象模型(Code Document object model,代码文档对象模型),它允许开发人员通过特定类型的对象来定义程序的各个方面或程序的一部分。 虽然CodeDOM很灵活,可以比较容易地进行扩展,并且支持比Visual Bas...
Async/Await在 C#语言中是如何工作的
本文翻译于Stephen Toub的这篇英文文章:How Async/Await Really Works in C# - .NET Blog (microsoft.com) 几周前,.NET Blog刊登了一篇文章 什么是 .NET,为什么要选择它?。它提供了对平台的高层次概述,总结了各种组件和设计决策,并承诺对所涉及的领域发表更深入的文章。这是第一篇这样的后续文章,深入探讨了C#和.NET中async/await的历史、背后的设计决策和实现细节。 对async/await的支持已经存在了十年之久。在这段时间里,它改变了为.NET编写可扩展代码的方式,而在不了解其底层逻辑的情况下使用该功能是可行的,也是非常常见的。你可以从一个像下面这样的同步方法开始(这个方法是“同步的”,因为调用者将无法做其他任何事情,直到整个操作完成并将控制权返回给调用者): 然后添加几个关键字,更改几个方法名称,最终得到以下异步方法(这个方法是 "异步 "的,因为控制权会很快返回给它的调用者,而且可能在与整个操作相关的工作完成之前): 语法上几乎相同,仍然能够利用所有相同的控制流结构,但现在是非阻塞性的,具有明显不同的底层执行模型,而且所有繁重的工作都由C#编译器和核心库为你完成。 虽然在不知道底层逻辑的情况下使用这种支持是很常见的,但我坚信,了解某些东西的实际工作原理有助于你更好地使用它。特别是...
使用Rootless Linux 容器保护你的 .NET 云应用
本文翻译于Richard Lander的这篇英文文章:Secure your .NET cloud apps with rootless Linux Containers - .NET Blog (microsoft.com) 从 .NET 8 起,我们所有的 Linux 容镜像都将包含一个non-root 用户。只需要一行代码就能以non-root用户身份托管您的 .NET 容器。这个平台级的变化将会使你的应用程序更加安全,并使 .NET 成为最安全的开发者生态系统之一。这是一个小的变化,但对深层防御(defense in depth)影响巨大。 这一变化的灵感来源于我们早期在 Ubuntu Chiseled 容器中启用 .NET 的项目。Chiseled(又称 "distroless")镜像旨在像设备一样,因此non-root是这些镜像最简单的设计选择。我们意识到,我们可以将Chiseled容器的non-root功能应用于我们发布的所有容器镜像。通过这样做,我们提高了.NET容器镜像的安全标准。 这篇文章是关于non-root容器的好处,创建它们的工作流程以及工作原理。在后续的文章中,我们也将讨论如何在Kubernetes中更好地使用这些镜像。另外,如果想要更简单的选项,那你应该查看.NET SDK 的内置容器支持。 最小特权 将容器托管为non-root符合最小特权原则。这是由操作系统提供的免...
为什么要选择.NET?
本文翻译于.NET Team的这篇英文文章:What is .NET, and why should you choose it? - .NET Blog (microsoft.com) 自从我们启动快速发展的.NET 开源和跨平台项目以来,.NET 发生了很大变化。我们重新思考并完善了该平台,添加了专为性能和安全性而设计的新低级功能,以及以生产力为中心的高级功能。Span<T>、硬件内在函数和可为空的引用类型都是示例。我们正在启动一个新的“.NET 设计要点”博客系列,以探索定义当今 .NET 平台的基础知识和设计选择,以及它们如何使您现在编写的代码受益。 本系列的第一篇文章全面概述了平台的支柱和设计要点。当您选择 .NET 时,它在基础级别上描述了“您得到了什么”,旨在成为一个充分且以事实为中心的框架,您可以使用它来向其他人描述该平台。后续帖子将更详细地介绍这些相同的主题,因为这篇帖子并没有完全公正地介绍这些功能中的任何一个。这篇文章不描述工具,如 Visual Studio,也不涵盖更高级的库和应用程序模型,如ASP.NET Core提供的那些。 我们所说的“.NET”是现代的 .NET Core。以防您错过了,我们在 GitHub 上作为开源项目于 2014 年启动了这个项目。它在Arm64、x64 和其他芯片架构上的Linux、macOS 和 Windows 上运行。它在一堆Lin...
宣布推出 .NET 社区工具包 8.1
本文翻译于Sergio Pedri的这篇英文文章:Announcing .NET Community Toolkit 8.1 - .NET Blog (microsoft.com) 我们很高兴地宣布 .NET Community Toolkit 8.1 版正式发布!这个新版本包括高度要求的新功能、错误修复和对 MVVM 工具包源代码生成器的大量性能改进,使开发人员在使用它们时的用户体验比以往更好! 就像在我们之前的版本中一样,我们非常感谢 Microsoft 使用该工具包的团队以及社区中的其他开发人员收到的所有反馈,这些反馈已经并将继续对我们如何设计所有新功能和改进并确定其优先级产生巨大影响。我们非常感谢每一位做出贡献并不断帮助 .NET Community Toolkit 变得更好的人! .NET 社区工具包中有什么? 正如我们在之前的公告帖子中所做的那样,让我们首先简要回顾一下 .NET Community Toolkit 包含的内容。它由几个独立的库组成: 这些库还广泛用于 Windows 附带的多个收件箱应用程序,例如 Microsoft Store 和照片应用程序! 有关 .NET Community Toolkit 历史的更多详细信息,请访问我们之前的 8.0.0 公告帖子的链接。 以下是 .NET Community Toolkit ...
官宣 .NET 8 Preview 1的发布
本文翻译于Jeremy Likness的这篇英文文章:Announcing .NET 8 Preview 1 - .NET Blog (microsoft.com). 欢迎使用 .NET 8! 第一个预览版可供您下载: claim your copy of the first .NET 8 preview 并立即开始构建应用程序。向下滚动以查看此预览中包含的功能列表。.NET 8 是一个长期支持 (LTS) 版本。这篇博文涵盖了推动增强功能优先级排序和选择开发的主要主题和目标。.NET 8预览版和发布候选版本将每月交付一次。 像往常一样,最终版本将在 11 月的某个时候在 .NET Conf 上发布。 .NET 版本包括产品、库、运行时和工具,代表Microsoft 内外多个团队之间的协作。 这篇博文中涵盖的更广泛的主题并不包含.NET 8的所有关键场景和投资。它们代表了很大的领域,但只是进入.NET 8 的所有重要工作的一部分。我们计划对ASP.NET Core, Blazor, EF Core, WinForms, WPF和其他平台进行广泛的投资。您可以通过阅读产品路线图了解有关这些领域的更多信息: 请务必查看themesof.net 了解有关GitHub问题跟踪 .NET 8里程碑的更多详细信息。 您可以下载...
MAUI中大家期待的MediaElement 控件终于来啦
本文翻译于Gerald Versluis的这篇英文文章:Play Audio and Video in .NET MAUI apps with the new MediaElement 。 最受期待的 .NET MAUI 控件之一:MediaElement现已发布。有了 MediaElement,您可以轻松地在 .NET MAUI 应用程序中播放音频和视频,在这篇文章中,您将了解到有关MediaElement第一个版本的所有信息以及我们对未来的计划!Media Element 是.NET MAUI Community Toolkit的一部分,这是一个社区创建的库,受到来自全球社区和 Microsoft 的优秀开发人员的支持。 什么是MediaElement? 有了 MediaElement,您就有了强大的控件,从而可以在 .NET MAUI 应用程序中播放多媒体。 得益于社区成员 Peter Foot 的出色工作,您可能已经从 Xamarin 社区工具包中了解到了 MediaElement。虽然那个版本已经很不错了,但它还有改进的空间,尤其是在 Android 上。 这就是为什么在将 MediaElement 移植到 .NET MAUI 时,我们从基层重建了所有内容。这样我们就可以在保留所有已经很好的部分的同时做一些改进。 底层逻辑 针对 Android,我们选择ExoPlayer用作平台对应物...
用 .NET 启动你的 DJI Ryze Tello 无人机
大疆的 DJI Ryze Tello 是入门级的无人机,不仅在 STEM 教育中有非常广泛的应用,也可以作为编程入门的首选。 通过 UDP 协议调用 DJI Ryze Tello SDK 可以让 DJI Ryze Tello 无人机执行起飞,降落,转向以及不同的花式动作。 本文将会通过 .NET 创建应用来控制 DJI Ryze Tello。 .NET UDP 编程 什么是 UDP “UDP(用户数据报协议)是一个与IP 协议一起使用的长期协议,用于在传输速度和效率比安全性和可靠性更重要的场合下发送数据。 UDP 使用一个简单的、具有最小协议机制的无连接通信模型。 UDP 使用校验和保证数据完整性,使用端口号以区分数据发送方和接收方中不同的应用程序。它无需握手会话,即将不可靠的底层网络直接暴露给了用户的应用程序:不保证消息交付、不保证交付顺序也不保证消息不重复。如果需要网络接口层面的纠错功能,则应用程序可以使用为此目的设计的传输控制协议(TCP)或者流控制传输协议(SCTP)。” 在现场实时测控领域,如果有实时、抗干扰性、安全性等要求,都可以采用 UDP 传输数据。我想这也是 DJI Ryze Tello 为何使用 UDP 协议通信的原因。 C# 调用 UDP Client 在 System.Net.Sockets 下你可以通过类 UdpClient 来完成 UDP 协议的相关调用。 这是官方给我们的...