随时随地以任意方式编写 .NET 应用程序
2017-10-10

希望大家现在都知道,Microsoft .NET 不再仅适用于 Windows。借助 .NET Core,可以使用想要的语言(C#、Visual Basic 或 F#)编写应用程序,这些应用程序可以在选定的任何 OS(Windows、macOS 或 Linux)上运行。当然,由于现在可以编写定目标到选定平台的应用程序,因此大家还期望能使用相同的开发者工具,这些超棒工具一直都是 .NET 开发的标志。令人鼓舞的是,随着我们支持的平台越来越多,用于创建超棒 .NET 应用程序的工具也越来越多。 

本文将逐个介绍这些开发工具,它们适用于不同的个人工作风格和 OS。首先,将介绍 SDK 随附的命令行工具,此类工具可与任意编辑器(尽管建议为 Visual Studio Code)相互配对。然后,将介绍 Visual Studio 2017 超棒的新功能,再介绍 Visual Studio 系列的最新成员 Visual Studio for Mac。最后,将介绍这些工具如何帮助大家利用软件容器,并尝试将应用程序顺畅发布到 Microsoft Azure 云中。

基本概念

为了方便本文演示,将通篇使用“.NET Core”一词,以保持一致性。不过,此名称涉及两项非常重要的技术,分别是 .NET Core 和 .NET Standard。.NET Core 是执行应用程序的跨平台运行时。.NET Standard 是由编译器强制执行的一组 API,这些 API 被用作类库的目标,因此一个库就可以在任何支持标准的运行时上运行。例如,.NET Core 2.0、.NET Framework 4.6.1 和 Mono 4.8 都支持 .NET Standard 2.0(及更低版本)类库。若要更好地理解这一概念,请参阅本期中的姊妹篇文章“揭秘 .NET Core 和 .NET Standard”。

同样值得一提的是,.NET Core 和 .NET Standard 2.0 支持的语言。粗略地讲,这两种技术的 2.0 版都支持 C#、Visual Basic 和 F#。不过,我们对这一版 Visual Basic 的目标是,启用 .NET Standard 2.0 类库。也就是说,Visual Basic 只提供类库和控制台应用程序的模板,而 C# 和 F# 则还提供 ASP.NET Core 2.0 应用程序模板。

改进了通用项目文件

处理 .NET Core 项目时,首先会注意到的地方之一是,它们共用高度简化的通用项目格式。也就是说,使用一种工具(例如,命令行工具)创建的项目,可以在任何支持 .NET Core 的平台(如 Visual Studio 或 Visual Studio for Mac)上运行。采用全新的项目文件格式后,便不再需要使用 GUID,也不再需要明确列出所含文件,这大大减少了将更新提交到版本控制系统时发生的合并冲突。下面的代码展示了新 C# .NET Core 控制台应用程序项目文件的全部内容:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.0</TargetFramework>
  </PropertyGroup>
</Project>

此外,通用格式也意味着同一团队的成员可以使用自己选择的设备和平台进行工作。如果三个团队成员分别想要在 Mac、Windows 和 Linux 上工作,他们全都可以顺畅参与同一个项目。若要详细了解更新后的项目格式,请访问 aka.ms/newprojectfile

命令行工具

任何开发者工具的基础都是软件开发工具包 (SDK),.NET Core 也不例外。.NET Core SDK 不可或缺的一部分是命令行接口 (CLI),支持用户使用命令行创建、生成和运行应用程序。借助 CLI,可以使用常用编辑器创建应用程序,而无需安装更重量级的工具。首先,安装免费的 .NET Core SDK(可从 dot.net 下载)。

安装 SDK 后,立即打开常用命令提示符,并运行“dotnet --help”,列出所有可用命令。dotnet 命令是 .NET CLI 的驱动程序,语法为“dotnet <谓词> [参数]”。例如,若要查看可以创建的所有项目类型模板,请键入“dotnet new”。  若要新建项目,请提供短名称作为“new”操作的参数;例如,“dotnet new razor”创建包含新 .NET Core 2.0 Razor 页面(若要了解这项超棒的新功能,请访问 aka.ms/razorpages)的 C# ASP.NET Core Web 应用程序。若要运行应用程序,请键入“dotnet run”,它会生成并启动应用程序。打开浏览器后转到输出字符串中指明的 URL(例如,http://localhost:5000),可以与要生成的应用程序进行交互。  由此观之,开发并不是什么难事,只需选择常用编辑器生成并运行应用程序即可。

单元测试

生成应用程序后,不妨在生命周期的相对早期添加单元测试支持。与预期一样,单元测试适用于 IDE,但也可以直接通过 .NET CLI 生成并运行单元测试。 

大家可能已注意到,“dotnet new”提供了两种不同的单元测试项目类型,分别为 xunit 和 mstest。首先,使用首选单元测试框架(如“dotnet new xunit”)创建单元测试项目,然后再在测试项目文件夹中键入“dotnet add reference <测试项目的路径>”,让 CLI 为大家添加对项目文件的引用。生成单元测试项目后,便可以使用“dotnet test”命令通过 CLI 运行测试项目。无论选择哪种项目类型,xunit 和 mstest 项目都受到 Visual Studio 和 Visual Studio for Mac 以及 CLI 的支持。

Visual Studio Code

虽然可以自由选择使用所需的任何编辑器,但对于渴望轻量级编辑体验同时又需要结合使用 .NET Core CLI 的用户,Visual Studio Code 提供的体验最佳。  Visual Studio Code 是轻量级跨平台编辑器,内置源代码管理和调试支持。通过将 .NET CLI 与 Visual Studio Code 结合使用,可以在所选的任何平台上生成 .NET 应用程序。首先,需要安装 .NET Core SDK,如前所述。在计算机上安装 SDK 后,便可以从 code.visualstudio o.com 下载并安装 Visual Studio Code,再选择 Visual Studio Code 左侧的“扩展”选项卡,安装 Microsoft 提供的 C# 扩展,即适用于 Visual Studio Code 的 C#(由 OmniSharp 提供技术支持)。(如果使用的是 F#,不妨也安装 Ionide-fsharp 扩展。请注意,若要获得 .NET Core 生成和调式支持,必须安装 C# 扩展。) 现在,可以使用 Visual Studio Code 开发 .NET Core 项目了。 

借助 C# 扩展,Visual Studio Code 可以代表用户调用 CLI,从而生成并运行应用程序以供调试。创建项目后,立即打开 Visual Studio Code,并选择“文件”菜单中的“打开文件夹”。打开 C# 文件 (.cs) 时会看到提示,即编辑器顶部的建议栏,建议生成必需资产以供生成和调试之用,如图 1 所示。选择“是”,便会生成两个文件:支持使用 Visual Studio Code 进行生成的 tasks.json 文件,以及支持调试的 launch.json 文件。现在,可以直接使用 Visual Studio Code 进行编辑、编译和调试。

Visual Studio Code 建议生成必需资产以供生成和调试之用

图 1:Visual Studio Code 建议生成必需资产以供生成和调试之用

Visual Studio

Visual Studio 会继续支持世界一流的开发者体验,对 .NET Core 的工具支持也不例外。Visual Studio 2017(版本 15.3)现已开始支持 .NET Core 2.0。若要在 Visual Studio 中开始编写 .NET Core 2.0 应用程序,需要下载并安装 .NET Core 2.0 SDK。在计算机上安装 SDK 后,立即重启 Visual Studio,便会发现新项目可定目标到 .NET Core 2.0。

我们设定的目标是,让 Visual Studio 2017 成为迄今为止提供的最高效的开发服务。为了提供一些亮点,我们改进了代码导航、新增了大量重构/快速修复命令,并增添了代码样式强制措施和 Live Unit Testing。

导航和重构:我们知道,在用户处理代码时,务必要提供对基准代码导航的巨大支持。下面列出了 Visual Studio 2017 中最受欢迎的代码导航改进:

  • 转到实现 (Ctrl+F12):从任何基类型或基成员转到各种实现。
  • 转到全部(Ctrl+T 或 Ctrl+,):直接转到任何文件/类型/成员/符号声明。可以使用此功能顶部的一排图标,以筛选结果列表或使用查询语法(例如,对文件使用“f searchTerm”、对类型使用“t searchTerm”等)。
  • 查找所有引用 (Shift+F12):现在,借助语法着色,可以综合项目、定义和路径,对“查找所有引用”结果进行自定义分组。还可以“锁定”结果,这样就可以继续查找其他引用,同时又不丢失原始结果。
  • 缩进参考线:灰色的竖虚线可以在代码中起到关键点的作用,方便用户获得可视范围内的上下文。可以通过常用的 Productivity Power Tools 添加此类参考线。

此外,光做到基准代码导航还是不够的;我们知道,在代码中查找要更改或清理的部分时,需要使用工具进行重构。为了帮助用户进行重构,现已开始支持执行以下操作:将类型移到同名文件中、同步文件和类型名称、为参数添加 null 检查、添加参数、添加缺少的 switch/Select case、同步方法、将方法转换为属性(反之亦然)和解决合并冲突等。 

代码样式:在 Visual Studio 2017 中,可以配置并强制执行团队的编码约定,通过 EditorConfig 提高整个存储库的一致性。EditorConfig 是一种开放的文件格式,我们与其社区合作,共同在此格式内提供 .NET 代码样式支持。团队可以配置约定首选项,并选择如何在编辑器内强制执行它们(如通过建议、警告或错误消息的形式)。这些规则适用于包含 EditorConfig 文件的目录中的任意文件。如果编码约定因项目而异,只要项目位于不同的目录,就可以在不同的 EditorConfig 文件中定义各个项目的规则。因为归根结底 EditorConfig 只是文本文件,所以可以将它轻松签入源代码管理系统中,并让它与源代码并存。若要详细了解 Visual Studio 中的 EditorConfig 支持,请访问 aka.ms/editorconfig

Live Unit Testing:生成 MSTest、xUnit 或 NUnit 测试项目后,就可以为 .NET Core 项目启用 Live Unit Testing (LUT)。LUT 是 Visual Studio 2017 Enterprise 版本中引入的一项新功能。启用 LUT 后,可以一边键入,一边在代码编辑器中看到有关单元测试覆盖率和测试通过/未通过的反馈,如图 2 所示。也就是说,不再需要离开编辑器,即可运行单元测试来验证代码更改。一键入代码,就可以在编辑器中看到即时反馈,查看所有受代码更改影响的测试的结果。

.NET Core 项目中运行的 Live Unit Testing

图 2:.NET Core 项目中运行的 Live Unit Testing

热衷于提升质量的团队和热爱测试驱动开发 (TDD) 的用户都会喜欢这项新功能。若要启用 LUT,请转到 Visual Studio 菜单栏中的“测试”条目,再依次选择“Live Unit Testing”和“启动”。

Visual Studio for Mac

Visual Studio for Mac 是 Visual Studio 系列的最新成员,适用于要在 macOS 上使用 IDE 的开发者。从 Xamarin Studio 起步,Visual Studio for Mac 有了很大的发展和变化,现已开始支持 C# 和 F# 项目。首先,安装 .NET Core 2.0 SDK(可从 dot.net 下载),依次选择“创建项目”和“.NET Core”类别下的“应用程序”条目,以选择所需的项目模板。 

将会看到一个功能完备的 IDE,可用于在 Mac 上开发 .NET Core 应用程序,如图 3 所示。我们正在努力解决的一个问题是,让 Visual Studio 与 Visual Studio for Mac 保持一致。现在,可以使用在 Visual Studio 中依靠的大部分功能,包括 IntelliSense、代码导航、重构、单元测试和源代码管理集成。为了支持 Web 开发,我们为 Visual Studio for Mac 引入了 Visual Studio HTML、CSS 和 JSON 编辑器。大家可能会注意到,Razor 文件 (.cshtml) 和 JavaScript/TypeScript 暂不受支持。不过,我们正在努力解决此问题,计划将在今后发布的更新中让 Visual Studio for Mac 支持它们。

Visual Studio for Mac

图 3:Visual Studio for Mac

工具兼顾新式云

随着技术不断发展,有一点是明确的,即越来越多的应用程序在创建之初就要在云中运行。也就是说,工具需要采用兼顾新式云的设计模式和做法,同时还要方便用户将应用程序从本地开发计算机快速转移到云中。  为了实现此目标,Visual Studio 和 Visual Studio for Mac 均已内置支持,不仅支持直接发布到 Microsoft Azure,还支持将应用程序打包为 Docker 容器。

直接发布到 Azure:准备好将应用程序迁移到云中运行时,很可能希望尽可能轻松地在云中开始尝试执行此操作。使用 Visual Studio 和 Visual Studio for Mac,都可以将应用程序直接从计算机发布到 Azure App Service。App Service 是完全托管式云环境,在其中运行应用程序,无需担心复杂的配置或基础结构管理。

具体操作真的很简单,只需右键单击项目并选择“发布”,即可使用 Visual Studio 或 Visual Studio for Mac 将应用程序从本地计算机发布到 Azure App Service。系统会提示输入一些信息(如应用程序的唯一 URL)。可以选择现有的应用服务计划(要为成员应用程序集合保留多少资源),也可以新建一个(如果还没有的话)。输入信息后,只需花几分钟时间,就可以在云中运行应用程序了。 

容器开发工具:关于新式云开发,我们逐渐明白的是,容器将彻底改变人们架构和生成软件的方式。使用容器,可以将应用程序及其所有依赖项(包括运行时副本)打包到一个单元中,这样能够保证对基础服务器的更改永远不会破坏应用程序。这会形成一种微服务体系结构模式。在此模式中,可以将应用程序中的每个逻辑单元都单独部署为一个容器,它们通过已定义的协议相互通信。这样一来,可以根据需要缩放应用程序的高需求部分,而无需付费缩放整个应用程序。这也意味着,修补程序只会影响正在更新的容器,而不会影响整个应用程序。

本着这种想法,我们为 .NET Core 设定的目标之一是,让它成为创建容器化微服务的主要运行时。Visual Studio、Visual Studio for Mac 和 Visual Studio Code 全都支持将应用程序生成为 Docker 容器。(请注意,在本文撰写时,必须有 Docker 工具扩展,Visual Studio for Mac 才提供 Docker 工具支持;Microsoft 为 Visual Studio Code 提供 Docker 扩展,以支持创建 Docker 容器。)

若要生成 Docker 容器,需要安装适用于 OS 的 Docker 工具(可以访问 docker.com 了解详细信息并下载工具)。安装必需项后,只需在 Visual Studio 或 Visual Studio for Mac 中右键单击项目,再依次选择“添加”和“Docker 支持”即可。这样可以向解决方案添加 docker-compose 项目,并将 Dockerfile 添加到项目中。借助这些资产,可以将项目生成到 Docker 容器中。然后,通过 IDE 运行应用程序时,就是在容器中(而不是直接在主机上)运行和调试应用程序了。令人鼓舞的是,本文介绍的发布到 Azure App Service 体验也支持发布 Linux Docker 容器。

总结

如果还没有尝试过生成 .NET Core 应用程序,现在就是最好时机。使用 .NET Core 和 .NET Standard 2.0(如“揭秘 .NET Core 和 .NET Standard”中所述),可以轻松创建 .NET 应用程序,无论选择的工具、OS、语言或工作风格如何。 

希望本次 .NET Core 工具概览能够对大家有所帮助。可以访问我们的博客 (aka.ms/dotnetblog),继续关注团队发展和后续改进。请尝试本文介绍的工具,并向我们发送反馈,让我们知道如何进一步提升 .NET Core 应用程序创建体验。可以在我们的博客文章中写下留言和问题,也可以直接通过 Visual Studio 和 Visual Studio for Mac 向我们发送反馈,具体方法为使用 IDE 内置的“报告问题”和“提供建议”功能。


Andrew Hall 是主管 Visual Studio 中 .NET 语言和工具的项目经理。大学毕业后,他先编写了业务线应用程序,然后又重回学校攻读计算机科学专业的硕士学位。取得硕士学位后,他加入了 Visual Studio 诊断团队,负责开发调试程序、分析和代码分析工具。然后,他转入 .NET 语言和工具团队,负责开发 .NET 语言和支持工具,包括适用于 ASP.NET、Web 和 Azure App Service 的工具。可通过 Twitter (@AndrewBrianHall) 与 Hall 取得联系。

Joe Morris 是负责 Visual Studio 中 .NET Core 工具和 Live Unit Testing 的项目经理。他获有计算机科学专业的硕士学位。上世纪 90 年代,他开始了自己的职业生涯,在美国的一些企业担任应用程序开发顾问。他于 1997 年加入 Microsoft 咨询服务部门(先是在艾奥瓦州,后来搬到了雷德蒙德)。在过去两年里,他的工作重心一直是静态代码分析和开发者实用工具。可通过 Twitter (@_jomorris) 与 Morris 取得联系。

衷心感谢以下 Microsoft 技术专家对本文的审阅:Dustin Campbell、Phillip Carter、Livar Cunha、Mikayla Hutchinson、Mads Kristensen、Jordan Matthiesen 和 Kasey Uhlenhuth

原文地址: https://msdn.microsoft.com/zh-cn/magazine/mt842494