使用C#写脚本
前言
使用.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
即可进入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-scriptConsole.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的封装,所以在执行效率上相比直接构建编译的项目还是会有所差别的。
所以不大建议使用到生产环境中。
【使用C#写脚本】在最近推出的.NET 6 preview 4中介绍了minimal API,只需要短短的几行就可以运行起来一个Web服务器了。
var app = WebApplication.Create(args);
app.MapGet("/", (Func)(() => "Hello World!"));
app.Run();
参考
- dotnet script
- C# Script
- C# scripts using dotnet-script
- ASP.NET Core updates in .NET 6 Preview 4
- Building Minimal APIs In .NET 6
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- 今天写一些什么
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- 小影写在2018九月开学季
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- iOS中的Block