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. iostat命令学习

    iostat命令主要用于监控linux系统下cup和磁盘IO的统计信息 可以通过iostat --help获得该命令的帮助信息 [oracle@std ~]$ iostat --help Usage: ...

  2. BSBuDeJie_02

    一 左边的类别数据 1 模型 和 字典中的数据对应 /* id */ @property (nonatomic, assign) NSInteger *id; /* 总数 */ @property ( ...

  3. html文本的基本设置

    一.字体属性: 选择字体:font-family:value,value....指定字体的显示,按照顺序直到能够匹配 字体的大小:font-size:39px: 字体加粗:font-weight:bo ...

  4. java面试问题整理-垃圾回收

    对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址.大小以及使用情况.通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象,通过这种方式确定哪些对象是"可达的" ...

  5. 一般企业网站,电商可以完全可以水平拓展的lanmp系统架构

    本来不打算把所有的架构方案和基础技术写出,毕竟是吃饭的家伙事,拿这套东西去面试完全可以对付只做过中小网站的经验的开发面试人员,但是我也是从别人的博客和文章学习和实践出来的 如果你没有基础的linux一 ...

  6. 10 款最好的 Python IDE

    Python 非常易学,强大的编程语言.Python 包括高效高级的数据结构,提供简单且高效的面向对象编程. Python 的学习过程少不了 IDE 或者代码编辑器,或者集成的开发编辑器(IDE).这 ...

  7. 掌握Thinkphp3.2.0----模型初步

    1.为什么要学习框架?框架是什么? 简单的说就是为了简单,提高开发的效率.至于什么是框架(一种规范),现在的我还不是很理解,容后再议. 学习框架最重要的就是遵循,按照开发者的意图来使用该框架. 2.t ...

  8. js获取当前时间戳 不需毫秒数

    var timestamp = Date.parse(new Date())/1000;

  9. .NET对象与Windows句柄(一):句柄的基本概念

    在.NET编程中,得益于有效的内存管理机制,对象的创建和使用比较方便,大多数情况下我们无须关心对象创建和分配内存的细节,也可以放心的把对象的清理交给自动垃圾回收来完成.由于.NET类库对系统底层对象进 ...

  10. 去除magento多店铺URL地址中的“___from_store=”

    magento 的多店铺功能,大多数情况下是根据语言来进行选择的,当添加了多店铺之后,一般情况下我们会选择开启添加store code到url地址中. Magento 自带的这种功能算是比较不错了,但 ...