什么是dotnet-script

"dotnet-script"是github上一个开源的.net core global tool, 项目地址https://github.com/filipw/dotnet-script。使用它,开发人员可以获得在命令行直接运行C#脚本文件的能力, 且不需要创建任何项目文件。

安装/卸载dotnet-script

.NET Core 2.1中引入了global tool, 所以你可以在命令行直接使用以下命令安装dotnet-script

> dotnet tool install -g dotnet-script
You can invoke the tool using the following command: dotnet-script
Tool 'dotnet-script' (version '0.26.1') was successfully installed.

Tips: 为了使用global tool, 请安装.NET Core SDK 2.1.300及以上版本。

如果希望卸载dotnet-script, 请使用一下命令

> dotnet tool uninstall dotnet-script -g

创建第一个HelloWorld脚本

下面我们通过一个最简单的例子,说明一下dotnet-script的使用方式。

首先我们创建一个helloworld.csx文件, 并在文件中编写以下代码

Console.WriteLine("Hello World!");

你没有看错,这个文件中只有一行代码,没有任何的using, namespace等代码。

然后我们在命令行执行dotnet-script helloworld.csx, 结果如下,"Hello World!"被正确的输出了。

C:\script>dotnet-script helloworld.csx
Hello world!

创建一个添加Nuget引用的脚本

dotnet-script可以支持使用Roslyn #r 语法(#r "nuget: {包名}, {版本号}")引用各种Nuget包。

例如,下面我们修改helloworld.csx文件, 引入Newtownsoft.Json库,输出一个序列化之后的字符串。

#r "nuget: Newtonsoft.Json, 11.0.2"

using Newtonsoft.Json;

Console.WriteLine(JsonConvert.SerializeObject(new {
Message = "HelloWorld!"
}));

我们使用命令行dotnet-script helloworld.csx重新运行helloworld.csx文件, 结果如下

C:\script>dotnet-script helloworld.csx
{"Message":"HelloWorld!"}

Tips: 这里使用的是默认的Nuget源, 如果你想手动添加其他Nuget源, 运行脚本的时候,请添加-s参数, 例dotnet script foo.csx -s https://SomePackageSource

EHRL

最新版本的dotnet-script还支持了EHRL - Read Evaluate Print Loop, 即读取-求值-打印-循环, 这是一个在诸如Ruby、Python和Lisp这样的动态语言才有的特性。

开发人员可以在命令行使用dotnet script命令, 进入EHRL模式, 根据你输入的表达式, dotnet-script会帮你打印出表达式的结果。

例:

C:\script>dotnet script
> 2+2
4
> var myName = "Lamond Lu";
> Console.WriteLine(myName.ToUpper());
LAMOND LU
>

当然在这里你也可以使用Roslyn #r 语法(#r "nuget: {包名}, {版本号}")引用各种Nuget包, 例:

C:\script>dotnet script
> #r "nuget: Automapper, 6.1.1"
> using AutoMapper;
> typeof(MapperConfiguration)
[AutoMapper.MapperConfiguration]
>

除此之外,EHRL中,还支持多行代码模式。 dotnet-script会帮助你检测代码块是否完整,如果当你点击回车的时候,代码块不完整,就会出现*开头的新行。

C:\script>dotnet script
> public class Foo{
* public string Name{get;set;}
* }
> var foo = new Foo();
>

运行远程脚本

除了运行本地脚本,最新版本的dotnet-script还添加了运行远程脚本的功能,你需要使用http/https将你的脚本文件暴露出来。

例:

C:\script>dotnet script https://tinyurl.com/y8cda9zt
Hello World

编译DLL或EXE文件

dotnet-script还支持根据csx脚本文件,生成EXE或DLL文件。

可用的参数列表如下:

参数 说明
-o 指定文件生成的目录,默认当前目录
-n 指定生成的文件名
-c 指定使用的配置[Release/Debug]
-d 是否启用Debug输出
-r 指定运行时

我们以第一个HelloWorld.csx为例

C:\script>dotnet-script publish helloworld.csx
Published C:\script\helloworld.csx (executable) to C:\script\publish\win10-x64

运行以上命令后,dotnet-script会使用SCD(Self-contained deployments)的方式生成script.dll和script.exe及运行它所需要的所有基础库。

总结

dotnet-script作为了一个global tool, 相当简单易用, 使用它,你可以像学习Python一样学习.NET Core,在命令行练习各种代码。当然开发人员也可以使用它编写一些简单脚本,而不需要每次都去创建工程项目文件。

.NET Core脚本工具dotnet-script的更多相关文章

  1. .net core下的dotnet全局工具

    .net core 2.1后支持了一个全新的部署和扩展命令,可以自己注册全局命令行. dotnet install tool -g dotnetsaydotnetsay 也可以自己构建自己的命令行,一 ...

  2. 『.NET Core CLI工具文档』(一).NET Core 命令行工具(CLI)

    说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:.NET Core Command Line Tools 翻译:.NET Core命令行工具 什么是 .NET Core ...

  3. 『.NET Core CLI工具文档』(七)dotnet-new

    说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:dotnet-new 翻译:dotnet-new 名称 dotnet-new -- 创建一个新的 .NET Core 项 ...

  4. REDGATE又一好用的脚本工具

    REDGATE又一好用的脚本工具   REDGATE又一好用的脚本工具 先说明一下:这个工具是免费的 下载地址:http://www.red-gate.com/products/dba/sql-scr ...

  5. 使用 .NET Core CLI 创建 .NET Core 全局工具

    https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=2&ch=&tn=baiduhome_pg& ...

  6. .NET Core 跨平台发布(dotnet publish)

    .NET Core 跨平台发布(dotnet publish) ,无需安装.NET Core SDK,就可以运行. 前面讲解了.NET Core 的VSCode 开发.现在来讲讲发布(dotnet p ...

  7. 面试小记---外部脚本必须包含 <script> 标签吗?

    外部脚本必须包含 <script> 标签吗? 答案是否定的. 身为小白的我一开始也是以为这句话的对了,因为本来嘛,引用外部脚本不都用的是<script>标签中的src属性吗.所 ...

  8. ArcGIS使用Python脚本工具

    在Pyhton写的一些代码,用户交互不方便,用户体验比较差,不方便重用.在ArcGIS中可以将用写的Python代码导入到ToolBox中,这样用起来就比较方便了.这里用按要素裁剪栅格的Python来 ...

  9. ArcMap自定义脚本工具制作

    原文 ArcMap自定义脚本工具制作 在制图的前期,一般需要做一些数据的整理,如图层合并.裁剪等工作.虽然在ArcMap中也有提供对应的工具,但使用起来需要点技巧.如批量裁剪,虽然可以实现,但出来的结 ...

随机推荐

  1. Nastya Is Buying Lunch

    At the big break Nastya came to the school dining room. There are nn pupils in the school, numbered ...

  2. Android应用程序支持不同屏幕(尺寸、密度)

    how to build a user interface using Android layouts for all types of devices 使用Android布局设计的UI接口用于不同的 ...

  3. c++链表基本操作

    #include <stdlib.h> #include <malloc.h> #include <stdio.h> typedef struct Node { i ...

  4. Rabin-Karp ACM训练

    求解问题 寻找S中T出现的位置或次数.假设S的长度为n, T的长度为m, 通过枚举S长度为m的字串的hash值与T的hash值比较.此时使用滚动hash的优化使复杂度不为O(mn). 算法说明 滚动h ...

  5. 各个模块的刷新js

    // 更新页面中的subgrid function refreshSubGrid(subgridName) { Xrm.Page.ui.controls.get(subgridName).refres ...

  6. 获取jwt(json web token)中存储的用户信息

    一个JWT实际上就是一个字符串,它由三部分组成,头部(header).载荷(Payload)与签名. Payload payload中可以保存用户的信息. var claims = new Claim ...

  7. React组件和生命周期简介

        React 简介----React 是 Facebook 出品的一套颠覆式的前端开发类库.为什么说它是颠覆式的呢? 内存维护虚拟 DOM 对于传统的 DOM 维护,我们的步骤可能是:1.初始化 ...

  8. java课程之团队开发冲刺阶段1.6

    一.总结昨天进度 1.依照视频学习了sqlite,但是由于视频的不完整性导致并不知道代码的实际效果怎么样. 二.遇到的问题 1.依据上一条,在date目录下date文件夹中,的确发现了数据库的文件,但 ...

  9. this全解js

    转(掘金) this关键字是JavaScript中最复杂的机制之一,是一个特别的关键字,被自动定义在所有函数的作用域中,但是相信很多JavaScript开发者并不是非常清楚它究竟指向的是什么.听说你很 ...

  10. 对matplotlib库的运用

    1.matplotlib库的运用效果图 绘制基本的三角函数                                                                        ...