.NET 动态脚本语言Script.NET 入门指南 Quick Start

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的强大功能,增加应用程序的灵活性。

时间: 2024-10-10 07:52:46

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

.NET 动态脚本语言

Script.NET (S#) 是一种允许为你的应用程序自定义行为,与本地.NET对象.类型和组件交互动态的脚本语言.托管应用程序本身可以改变一个xml配置脚本运行时的默认行为,更换绑定的方法,属性,构造原生的行为.NET类型,名称,函数和类型的解析等. Script.NET 支持以下平台: .NET Framework 2.0, 3.5 Compact Framework 3.5 Silverlight 4 XBox (via XNA framework) 下载地址:http://www.pr

脚本语言script

编程初学者,在学习的时候总会听人说到或者看到"脚本"这个词汇,我初学的时候也不清楚脚本是什么,所以每每看到有人说你会写"脚本"的时候,总以为是一些高深深奥的编程技术.然而事实正好相反,脚本语言是一种比编程语言更为简单,轻便,快捷的语言,下面我们来谈一下什么是脚本. 在谈脚本之前,我们先谈一下什么是编程,一般入门编程语言多多少少会有所了解,编程就是把人想要让计算机做的事情告诉计算机. 计算机所能理解的命令其实只有 0和1 组成的序列,但是要是让我们通过各种 0和1 组

Chapter 0.SymmetricDS快速入门指南( Quick Start Guide)

本文档是SymmetricDS3.6.14文档的第一章节Quick Start Guide文档的翻译,的目的是帮助读者快速搭建一个SymmetricDS集群并普及一些基本概念术语. 本文档描述了如何在两个SymmetricDS节点之间同步两个相同schema的数据库.下面的例子构建了一个分销业务模型,有一个中央数据库(我们叫它root或者corp节点)和多个零售商店的数据库(我们叫它client或者store节点).对于本教程,我们将只有一个store(商店)节点,如下图.如果你愿意,可以再教程

Socket5入门指南

官方网址:http://ss5.sourceforge.net/ 场景描述 在支付项目的开发中,出于安全的考虑,App所部署的网段,不能直接访问公网,所以需要通过技术手段,让其可以访问公网. 尝试了几种方法,各有优缺点: Nginx转发,缺点是证书传不到第三方,不可接受: RINETD转发,缺点是只能转发到固定IP,不可接受: 配置路由规则,缺点是会对整个机器路由产生影响,不确定是否安全可靠: Socket5代理,缺点是要改代码,但是可以代理Http/Https/Ftp等,可以满足要求. SS5

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

https://razorengine.codeplex.com/ 下载并引用:razorengine.dll 代码里这样写,用mvc的人都会!Razor语法! string template = "Hello @Model.Name! Welcome to Razor!"; string result = Razor.Parse(template, new { Name = "World" });

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

核心内容概述 1.JavaScript加强,涉及到ECMAScript语法.BOM对象.DOM对象以及事件. 2.Ajax传统编程. 3.jQuery框架,九种选择器为核心学习内容 4.JQuery UI插件 5.jQuery Ajax编程 6.jQuery第三方插件 7.反向Ajax编程(彗星) 一.JavaScript基础加强 JavaScript是在浏览器内容运行,无需编译.解释执行动态脚本语言,是一种弱类型语言,所有变量使用var定义. JavaScript的3个组成部分分别为:核心(E

动态网页脚本语言

在ASP .PHP.JSP环境下,HTML代码主要负责描述信息的显示样式,而程序代码则用来描述处理逻辑.普通的 HTML页面只依赖于Web服务器,而ASP .PHP.JSP页面需要附加的语言引擎分析和执行程序代码.程序代码的执行结果被重新嵌入到HTML代码中,然后一起发送给浏览器.ASP .PHP.JSP三者都是面向Web服务器的技术,客户端浏览器不需要任何附加的软件支持. 二.技术特点: (一)ASP的技术特点: 1. 使用VBScript .JScript等简单易懂的脚本语言,结合HTML代

(五)Lua脚本语言入门

---恢复内容开始--- 写完这篇Lua脚本语言入门,自己就要尝试去用Lua脚本语言写esp8266了,,自己现在挺心急的,因为朋友使用esp8266本来说自己帮忙写好程序的,但是用的单片机不一样自己没有,没有办法测试,用AT指令就显得不方便,还要根据单片机改程序,,而且自己以前用感觉AT指令发信息那块,麻烦,,,,自己知道用脚本去操作8266要比AT指令灵活和稳定的多,真想赶紧学会用Lua脚本去操作8266,那样的话就可以很方便的帮到朋友了......本来答应了,,,,,,,竟然食言了....

Ruby(面向对象程序设计的脚本语言)入门

Ruby是一种为简单快捷的面向对象编程(面向对象程序设计)而创的脚本语言. 简介 Ruby 是开源的,在Web上免费提供,但需要一个许可证. Ruby 是一种通用的.解释的编程语言. Ruby 是一种真正的面向对象编程语言. Ruby 是一种类似于 Python 和 Perl 的服务器端脚本语言. Ruby 可以用来编写通用网关接口(CGI)脚本. Ruby 可以被嵌入到超文本标记语言(HTML). Ruby 语法简单,这使得新的开发人员能够快速轻松地学习 Ruby. Ruby 与 C++ 和