前言
使用.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本身的安装相对容易。
- 安装dotnet core 2.1+ sdk ,如果使用 C# 8语言特性,需要安装 dotnet core 3.1+ sdk
- 运行
dotnet tool install -g dotnet-script
即可
dotnet-script 安装完成之后,直接运行dotnet script
即可进入RPEL模式中,直接撸C#代码直接运行。
~$ dotnet script
> var x = 1;
> x+x
2
想要更好的体验就需要安装VS Code和OmniShap。
- 安装VS Code
- 安装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();