Script.NET是一种动态的脚本语言,它使得程序可扩展,可定制,和维护性好。和Office系列的VB Script相似,可以在应用中嵌入大量的代码块,以便在运行时才执行这些代码。

Script.NET的设计理念是:简单(simplicity),有效率(efficiency),容易上手(intuitive)。先通过例子,来做一个基本的了解。

using System;
using System.Diagnostics;
using System.IO;
using ScriptNET;
using ScriptNET.Runtime;
namespace Debug.Net
{
class Program
{
static void Main(string[] args)
{
RuntimeHost.Initialize();
Script s = Script.Compile("Console.WriteLine('Hello World');");
s.Execute();
RuntimeHost.CleanUp();
}
} }

为了编译这个例子,请先添加对程序集ScriptDotNet.dll的引用,它的Target是.NET 3.5。这个例子可以看出,Script.NET是如何调用.NET Framework的类型,并调用它的方法。再来看一个例子

RuntimeHost.Initialize();
object obj=Script.RunCode(" return 1+1;");
Console.WriteLine(obj);

这个例子演示了,如何运行Script.NET的代码片段。

数据类型,常量,表达式,语句

作为一门语言,一般会包含语法,数据类型,表达式,语句,这是语言层面的基础内容。来看下面的表格,

Script.NET支持的数据类型

常量,boolean类型的常量是true或false, null表示对象为空,字符串用单引号括起来。

运算符号:+, -, *, / ,%, ! , | , & , != , > , < , is  。其中is用于对象类型。

请看下面的例子表达式,

X = (y+4)*2;
Y = a[5] + 8;
Z = Math.Sqrt(256);
P = new System.Drawing.Point(3,4);

语句 Script.NET程序是语句的集合,有三种常用的语句:顺序(sequencing ),循环(loop),分支(branching)

If ... Then ... Else ...     if (Expression) statement else Statement

if (x>0) y = y + 1 ; else y = y ?1;      if (x>0) message = 'X is positive';

For ...    for (Expression1;Expression2;Expression3) Statement

sum=0;
for(i=0; i<10; i++)
   sum = sum + a[i];

Foreach ... in ...    foreach (Identifier in Expression) Statement

arr=[1,2,3,4,5];    sum = 0;
foreach(i in arr ) sum = sum + i;

While ...   while (Expression) Statement

while (i>0) i = i-1;

Switch

switch (expr){
case expr1: statement
   ...
default: statement
}

switch (i){
   case 1: MessageBox.Show('Hello!');
   case 2: MessageBox.Show('?');
   default: MessageBox.Show('No way');
}

Break, Continue   只用于循环语句中,用于跳出循环
Return  用于返回函数(function)

函数 function

Script.NET是脚本语言,而不是面向对象的OOP语言。通常会将一将代码片段封装成函数,函数的定义语法如下

function(id1,id2,…,idn) {

statement}

function fac(n){

if (n==1) return 1;

else return n*fac(n-1);

}

MessageBox.Show(fac(5).ToString());

Func_pointer = fac;

Func_pointer(4);


下面的代码,演示了Script.NET与Host的交互,从Host中获取值

RuntimeHost.Initialize();
List<int> vals = new List<int>();
vals.AddRange(new int[] { 1, 2, 3, 4 });
Script script = Script.Compile(@"
rez = 0;
foreach (number in numbers)
rez += number;"
); script.Context.SetItem("numbers", vals);
object rez = script.Execute();
Console.WriteLine(rez);

运行程序,输出结果如下

Script Context  脚本上下文

脚本上下文存储运行时信息,变量,和引入的类型,它可以引入.NET的对象到脚本中,以运用.NET Framework的强大功能。下面的例子演示Script.NET与Host的类型互操作

class Program
{
static void Main(string[] args)
{
RuntimeHost.Initialize();
Type type = RuntimeHost.GetType("A");
object script = Script.RunCode(@" a=new A();
a.Name='From Script.NET';
return a.Name;
");
Console.WriteLine(script);
}
}
public class A
{
public string Name { get; set; }
}

在Host中定义类型A,并引用它,可以在Script.NET中直接使用。也可在Host中定义类型,然后把它的值传到Script.NET中,请看例子

RuntimeHost.Initialize();
Type type = RuntimeHost.GetType("A");
A a = new A();
a.Name = "From Host";
Script script = Script.Compile(@"
ab.Name='From Script.NET';
return ab.Name;
");
script.Context.SetItem("ab", a);
script.Execute();
Console.WriteLine(script);

启动调试,在script.Execute执行前后,对象a的Name属性值是不同的。

 

Runtime Configuration 运行时配置

在Script.NET压缩包的根目录,找到配置文件RuntimeConfig.xml,把它添加到项目中。它包含,要引用的程序集,类型映射,和运行Script.NET引擎时,可以指定的初试化代码。

<References>
   <Assembly name="System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" sn="true"/>
</References>
<Types>
   <Type alias="string" name="System.String" />
   <Type alias="int" name="System.Int32" />

……

</Types>

<Initialization>
    <![CDATA[
    ]]>
  </Initialization>

比如,可以在Initialization区域定义数值常量,或是初始化代码,如下所示

<Initialization>
    <![CDATA[
       Pi=3.14;
       Console.WriteLine('Jack is right');
    ]]>
  </Initialization>

再回到Script.NET脚本代码中,代码如下

RuntimeHost.Initialize(new FileStream("RuntimeConfig.xml",FileMode.Open));
Script script = Script.Compile(@"
Console.WriteLine(Pi);
");
script.Execute();
Console.WriteLine(script);

运行程序,可看到控制台输邮结果如下

注意,Script.NET的标识符是大小写敏感的,如果在脚本调用中把Pi写成了PI,会报异常。

Unhandled Exception: ScriptNET.Runtime.ScriptIdNotFoundException: Namespace PI is not found

Script.NET原来的名称是S#, 文档和实际的代码有差异。我是根据对.NET的理解来推断它的用法,发生错误的原因,再加上它本身是个开放源码的项目,可以直接集成到现有的应用程序中,发生错误也可以源代码的方式调试。以这种方式,可以将应用程序代码中,将需要动态编译的代码,转化为Script.NET的脚本,借助于Script.NET的强大功能,增加应用程序的灵活性。

.NET 动态脚本语言Script.NET 入门指南 Quick Start的更多相关文章

  1. Spark高速入门指南(Quick Start Spark)

    版权声明:本博客已经不再更新.请移步到Hadoop技术博客:https://www.iteblog.com https://blog.csdn.net/w397090770/article/detai ...

  2. .NET 动态脚本语言

    Script.NET (S#) 是一种允许为你的应用程序自定义行为,与本地.NET对象.类型和组件交互动态的脚本语言.托管应用程序本身可以改变一个xml配置脚本运行时的默认行为,更换绑定的方法,属性, ...

  3. 脚本语言丨Batch入门教程第四章:调用与传参

    今天是Batch入门教程的最后一章内容:调用与传参.相信通过前面的学习,大家已经掌握了Windows Batch有关的基础知识和编程方法,以及利用Windows Batch建立初级的编程思维方式.今后 ...

  4. 脚本语言丨Batch入门教程第三章:逻辑判断

    通过学习Batch入门教程的前两章内容,我们已经大致掌握了基本概念和认识变量的相关内容,今天我们要跟大家继续分享第三章内容:Batch入门教程之逻辑判断.  前期回顾  ◀Batch入门教程丨部署与H ...

  5. Razor Engine,动态脚本语言,mvc上的语法,适用于文件内容生成,静态网页生成等。

    https://razorengine.codeplex.com/ 下载并引用:razorengine.dll 代码里这样写,用mvc的人都会!Razor语法! string template = & ...

  6. [Java面试九]脚本语言知识总结.

    核心内容概述 1.JavaScript加强,涉及到ECMAScript语法.BOM对象.DOM对象以及事件. 2.Ajax传统编程. 3.jQuery框架,九种选择器为核心学习内容 4.JQuery ...

  7. 使用Lua脚本语言开发出高扩展性的系统,AgileEAS.NET SOA中间件Lua脚本引擎介绍

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  8. DOM操作技术之动态脚本与动态样式(兼容版)

    动态脚本 使用<script>元素可以向页面中插入Javascript代码,一种方式是通过其src特性包含外部文件,另一种方式就是用这个元素本身来包含代码. 而我们要说的动态脚本,指的是在 ...

  9. Java动态调用脚本语言Groovy

    Java动态调用脚本语言Groovy 2019-05-15 目录 0. pom.xml添加依赖1. 使用GroovyShell计算表达式2. 使用GroovyScriptEngine脚本引擎加载Gro ...

随机推荐

  1. ubuntu14.04下安装ngnix,mediawiki,nodebb,everything,gitlab

    本周折腾了以下几个东西,mediawiki(维基),nodebb(论坛),gitlab(私有git服务器). 本来的目的是搭建一个wiki,选用了mediawiki后,使用apache搭建好了. 搭论 ...

  2. linux一些基本命令

    linux查看自己外网ip:curl ifconfig.me 删除目录:rm -rf 目录名 查看版本:rpm -q 版本 修改文件的用户权限:chown kds:kds agent.crontab修 ...

  3. shape

    <?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http:/ ...

  4. Apache Spark技术实战之8:Standalone部署模式下的临时文件清理

    未经本人同意严禁转载,徽沪一郎. 概要 在Standalone部署模式下,Spark运行过程中会创建哪些临时性目录及文件,这些临时目录和文件又是在什么时候被清理,本文将就这些问题做深入细致的解答. 从 ...

  5. 用3D再现2D偶像的可爱,Cygames【偶像大师 灰姑娘女孩】开发示例

          作为万代南梦宫娱乐的偶像养成游戏[偶像大师]的派生作品,是由Mobage创作的[偶像大师 灰姑娘女孩].这个游戏的最新作品,是现在累计下载突破1200万的大作,Android/iOS平台的 ...

  6. 开发者所需要知道的 iOS 10 SDK 新特性

    转自:https://onevcat.com/2016/06/ios-10-sdk/ 写的很好啊.哈哈哈 总览 距离 iPhone 横空出世已经过去了 9 个年头,iOS 的版本号也跨入了两位数.在我 ...

  7. jquery in confluence.

    https://confluence.atlassian.com/confkb/how-to-use-javascript-in-confluence-313458839.html https://a ...

  8. Qt在pro文件中加入带空格的路径(使用$$quote关键字)

    LIBS += -L$$quote(C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib) INCLUDEPATH += $$quote(C: ...

  9. GridView实现方块布局

    效果如下: 先创建一个BaseViewHolder package com.example.griddemo; import android.util.SparseArray; import andr ...

  10. ceph network introduce

    网络结构 Ceph 使用以太网连接内部各存储节点以及连接 client 和集群.Ceph 推荐使用两个网络: 前端(北向)网络( a public (front-side) network):连接客户 ...