前言

使用.NET的同学们可能都会有一个比较痛苦的体验,就是如果需要写一段测试的代码或者示例代码,也不得不创建一个项目去处理,即便是最基础的控制台程序, 使用 dotnet cli,也需要面对如下一段最基础的入口代码。

using System;
namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

全然不像python、js之类,打开编辑器/命令行就可以撸代码一样的方便。

作为主流的开发语言,自然是有特定的解决方案的。

老牌的.NET程序员可能熟悉的一个开发工具LINQPad,就是一个不错的.NET代码演练工具,同时也提供了F#和SQL语言支持,设置可以直接链接数据库进行查询,不可谓不强大。
如今LINQPad 6 也支持了.NET 5,也是一个不错的开发辅助工具。
虽然LINQPad也提供了免费版的,但是想要使用NuGet包集成、代码提示、debug等高级功能的话,还是需要购买授权的,如果经济能力富裕的话,尽量直接购买PREMIUM版本即可,体验最完整的LINQPad。

除了LINQPad,还有其他很多的选择,其中一个能够获取C#最原生体验的,就是直接使用C# script。
早在 VS 2015 update 1的时候,VS就集成了一个 C# REPL Command-Line Interface(csi.exe),可以在命令行中直接执行C#语句,整体的体验和Python REPL和Node.js REPL差不多。于此同时,推出了一种新的脚本文件格式 csx,这样的话就可以使用C#写脚本文件了。

.NET Core时代以来,有了更多开源工具的选择,其中的 dotnet script就是一个非常不错的C#脚本工具。

结合VS Code 和 OmniSharp ,使用 dotnet script可以给到相当不错的C#脚本开发体验。
当然也是支持NuGet包和调试,而且开源免费,得益于相关功能的跨平台特性,基本支持全平台。

安装

dotnet script本身的安装相对容易。

  1. 安装dotnet core 2.1+ sdk ,如果使用 C# 8语言特性,需要安装 dotnet core 3.1+ sdk
  2. 运行dotnet tool install -g dotnet-script 即可

dotnet-script 安装完成之后,直接运行dotnet script即可进入RPEL模式中,直接撸C#代码直接运行。

~$ dotnet script
> var x = 1;
> x+x
2

想要更好的体验就需要安装VS Code和OmniShap。

  1. 安装VS Code
  2. 安装C#插件,由OmniSharp驱动,所以安装完成之后插件会自动启动相关的服务

使用

安装完以上工具之后,新建一个.csx文件(例如main.csx),也可以使用dotnet script init指令直接初始化一个文件出来。

#!/usr/bin/env dotnet-script

Console.WriteLine("Hello world!");

这个就有点脚本语言的感觉了。

在命令行直接执行dotnet script main.csx即可。
终归不是解释性语言,C# script还是需要编译的,所以稍作等待,就可以看到输出结果了。

  • 如何使用命令行参数

执行形如dotnet script main.csx -- arg1 arg2 arg3,就可以将arg1,arg2,arg3作为参数传递到脚本中。
在脚本代码中可以从全局集合Args中获取。

  • 如何添加NuGet包

在脚本文件的头部添加#r指令就可以安装NuGet包

#r "nuget: AutoMapper, 6.1.0"

如今的nuget.org也增加了'Script & Interactive'的引用指令,可以方便的复制使用了。

需要注意的是,在VS Code中,每次添加新的NuGet包,需要重启OmniSharp Server 才会使代码分析生效。
好在VS Code在(Ctrl/CMD + Shift + P)命令栏可以直接执行指令。

  • 如何引用其他文件

当代码量比较大的时候,可以拆分文件方便管理,文件间可以使用#load指令进入导入。
例如

#load "Demo.csx"

More

dotnet script更多的使用方法可以参考Github

由于dotnet script只是对roslyn API的封装,所以在执行效率上相比直接构建编译的项目还是会有所差别的。
所以不大建议使用到生产环境中。

在最近推出的.NET 6 preview 4中介绍了minimal API,只需要短短的几行就可以运行起来一个Web服务器了。

var app = WebApplication.Create(args);
app.MapGet("/", (Func<string>)(() => "Hello World!"));
app.Run();

参考

  1. dotnet script
  2. C# Script
  3. C# scripts using dotnet-script
  4. ASP.NET Core updates in .NET 6 Preview 4
  5. Building Minimal APIs In .NET 6
03-05 15:10