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.protsyk.com/scriptdotnet/versions/latest/

新建一个控制台项目之后,添加ScriptDotNet.dll的引用,程序代码如下

using System;
using ScriptNET;
using ScriptNET.Runtime; namespace TestScript
{
class Program
{
static void Main(string[] args)
{
RuntimeHost.Initialize(); //运行Script.NET脚本
Script s = Script.Compile(@"
s='hello'+' '+'world';
Console.WriteLine(s);");
s.Execute(); //运行Script.NET的代码片段
object obj = Script.RunCode(" return 1+1;");
Console.WriteLine(obj);
}
}
}

这里用到两个类:RuntimeHostScript


RuntimeHost
是脚本处理运行时基础设施的集成核心点。它必须在使用script.net 类库前初始化。

RuntimeHost.Initialize();

  这是通过默认配置初始化运行时,但这个对于Win32的默认配置与Silverlight 和CF是不同的。

下面这个重载可以使用自定义配置:

public static void Initialize(Stream configuration);

  参数是有效的XML配置文件的文件流。

在配置设置时,运行时有一些可定制的部分:

  • Binder -- 用于绑定对象的成员;
  • Activator -- 用于构造对象的实例,默认的Activator 用binder来绑定类型的构造函数;
  • Scope Factory -- 用于生成给定类型的作用域;
  • Assembly and Type Manager -- 用于载入程序集,预览它们的类型,管理及解决给定的名称。不同平台的默认程序集管理是不同的。
RuntimeHost.Binder = new DefaultBinder();
RuntimeHost.Activator = new DefaultActivator();
RuntimeHost.ScopeFactory = new ScopeFactory();
RuntimeHost.AssemblyManager = new DefaultAssemblyManager();
 
RuntimeHost.Initialize();

  若要清除RuntimeHost的所有信息,可以调用

RuntimeHost.CleanUp();

  

Script用于编译代码

(这图是1.0.0.3的,会与现今版本的有差异)

此外,从这里Script.NET for .NET 3.5 (old version)可以下载一个IDE,方便脚本的调试。

数据类型和常量

  

类型名称 对应.NET的类型 初始化 常量
double double x=3.14; 数字串
long long x=1; 数字串
string  string s=‘Hello World’; 单引号或双引号括起来的符号串
bool bool bool=true; true/false
array object[] a=[3.14 , 1 , "Hello world" , true , s ] 由方括号括起的变量名或常量序列

此外null表示对象为空

运算符

运算符类别   运算符
基本

x.y

f(x)

a[i]

x++

x--

一元

+

-

!

~

++

--

乘法

*

/

%

加法

+

-

关系和类型检测

<

>

>=

<=

is

相等

==

!=

逻辑“与” &
逻辑“或” |
条件 AND &&
条件 OR ||
赋值

=

+=

-=

表达式

例子如下:

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

流程控制

  顺序 (略)

  分支

  if (Expression) statement [ else if (Expression) statement ] else Statement

       

if(1<0)
b=1; if(1<3)
b=2;
else
b=3; if(1<0)
b=1;
else if(1>3)
b=2;
else
b=3;

  

switch (expr)


  case expr1: statement 
   ... 
  default: statement 
}

  

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

循环

  for(Expression1;Expression2;Expression3) Statement

sum=0;
for(i=0; i<10; i++)
sum = sum + a[i];
  foreach (Identifier in Expression) Statement
a=[1,2,3,4,5];
sum = 0;
foreach(i in a )
sum = sum + i;
  while (Expression) Statement
while(i<100)
i++;
break, continue   只用于循环语句中,用于跳出循环
return  用于返回函数

Using语句块

using(type or object){
Statement
}
using (Math) {
return Pow(2,10);
} a = new List<|int|>();
using(a){
Add(10);
}
return a[0];

try...catch....finally  语句块

try

{

....

}

catch(e)

{

......

}

finally

{

......

}

函数 (function)

函数的定义语法如下

function functionName(p1,p2,...pn)

{

statement

}

以下是Script.NET的内置函数

eval – 求表达式的值并返回,例子 a = eval('2+3*4');

clear – 清空上下文变量,已经过时

array - 创建数组,例子 a = array('alex', 'peter'); // a is of type string[]   又如    b = array('alex', 1, 2); // b is of type object[]

  由于Script.NET可以调用.NET的类库,所以其内置函数就不多了。说到调用类库,免不了要加载dll。加载dll的方式有两种,一种是通过创建新的DefaultAssemblyManager对象

 RuntimeHost.AssemblyManager = new DefaultAssemblyManager();

,调用其AddAssembly方法把Assembly逐一添加进去。(注意:一旦应用这种方式添加程序集,则要把所有需要用到的dll都添加进去,甚至连Console所在的dll——mscorlib.dll)。另一种是通过其专用的配置文件添加,配置文件格式如下:

<?xml version="1.0" encoding="utf-8" ?>
<Configuration>
<References>
</References>
<Types>
</Types>
<Scopes>
</Scopes>
<Operators>
</Operators>
<Settings>
</Settings>
<Initialization>
<![CDATA[
]]>
</Initialization>
</Configuration>

在References节点内添加则行,例如

  <References>
<Assembly name="System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" sn="true"/>
</References>

凡是加载进去的程序集,RuntimeHost都会自动using程序集里所有的命名空间。这样会引发脚本的安全性问题,此问题有待解决。。。

.NET 动态脚本语言的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 【开源】.Net 动态脚本引擎NScript

    开源地址: https://git.oschina.net/chejiangyi/NScript 开源QQ群: .net 开源基础服务  238543768 .Net 动态脚本引擎 NScript   ...

  7. 小试牛刀C#作为脚本语言执行解密

    背景 我们知道Unity3d是通过C#脚本语言的形式来实现游戏的逻辑代码编写,同样SCOTT服务器也设置了通过C#脚本来实现游戏逻辑,但是本文并不是想真正分析解密他们的运行机制,只是想通过自己的一个需 ...

  8. JavaScript脚本语言基础(一)

    导读: JavaScript代码嵌入HTML文档 JavaScript代码运行方式 第一个实例 JavaScript的三种对话框 定义JavaScript变量 JavaScript运算符和操作符 Ja ...

  9. Java SE 6 新特性: 对脚本语言的支持

    2006 年底,Sun 公司发布了 Java Standard Edition 6(Java SE 6)的最终正式版,代号 Mustang(野马).跟 Tiger(Java SE 5)相比,Musta ...

随机推荐

  1. 优秀的PE工具收藏

    优秀的PE工具收藏... ----------------------- ------------------------------------------<排名不分先后..自己喜欢的就是最好 ...

  2. 《Java从入门到放弃》JavaSE入门篇:面向对象概念(入门版)

    要知道什么是面向对象,你首先要有个对象吧,所以······没有对象的可以回家洗洗睡了· 好吧,前面是开玩笑,要说明什么是面向对象,我们还是先 例子: 小呆:"小傻,你今天早餐吃的什么?&qu ...

  3. 使用php下载的文件打不开,自己用着没问题,客户用就不行?

    1 现象: 开发的时候用的好好的文件下载功能,部署到客户那边就不好使了,几乎所有从服务器下载下来的文件都不能打开. 比较了上传前的文件.上传后服务器端的文件.下载后本机的文件,发现同一个文件,上传后还 ...

  4. 【Java学习笔记之三十一】详解Java8 lambda表达式

    Java 8 发布日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Java 8之前 ...

  5. 为什么内存使用2G的苹果手机比内存使用4G的安卓机更流畅?

    这是在国外一家网站看到的,分析得不错,原文如下: Why does the iPhone require less RAM than Android devices? There are people ...

  6. [2017-08-21]Abp系列——如何使用Abp插件机制(注册权限、菜单、路由)

    本系列目录:Abp介绍和经验分享-目录 Abp的模块系统支持插件机制,可以在指定目录中放置模块程序集,然后应用程序启动时会搜索该目录,加载其中所有程序集中的模块. 如何使用这套机制进行功能插件化开发? ...

  7. IDEA集成SSH Session

    1,在菜单栏选择Tools -> Start SSH Session 2,在SSH Session表单中输入: 3,在IDEA下方会弹出Terminal控制台,直接敲命令即可.  ------- ...

  8. 一步步带你做vue后台管理框架(二)——上手使用

    系列教程<一步步带你做vue后台管理框架>第二课 github地址:vue-framework-wz 线上体验地址:立即体验 闲扯再多不会用也没白搭,这节课我来带大家直接上手框架,体验到简 ...

  9. Spring+mybatis 实现aop数据库读写分离,多数据库源配置

    在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数据库.Master库负责数据更新和实时数据查询,Slave库当然负责非实时数据查询.因为在实际的应用中,数据库都是读多写少 ...

  10. Vue组件库的那些事儿,你都知道吗?

    前段时间一直在研究Vue组件库,终于在组内派上了用场.来给大家贡献一篇关于Vue组件库的相关知识.经验不多,如果有不合理的地方还请多多指出哦--- 回想一下,在你们公司或者你们小组是否有一个以上的项目 ...