.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.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);
}
}
}
这里用到两个类:RuntimeHost,Script。
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 动态脚本语言的更多相关文章
- .NET 动态脚本语言Script.NET 入门指南 Quick Start
Script.NET是一种动态的脚本语言,它使得程序可扩展,可定制,和维护性好.和Office系列的VB Script相似,可以在应用中嵌入大量的代码块,以便在运行时才执行这些代码. Script.N ...
- Razor Engine,动态脚本语言,mvc上的语法,适用于文件内容生成,静态网页生成等。
https://razorengine.codeplex.com/ 下载并引用:razorengine.dll 代码里这样写,用mvc的人都会!Razor语法! string template = & ...
- 使用Lua脚本语言开发出高扩展性的系统,AgileEAS.NET SOA中间件Lua脚本引擎介绍
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- [Java面试九]脚本语言知识总结.
核心内容概述 1.JavaScript加强,涉及到ECMAScript语法.BOM对象.DOM对象以及事件. 2.Ajax传统编程. 3.jQuery框架,九种选择器为核心学习内容 4.JQuery ...
- Java动态调用脚本语言Groovy
Java动态调用脚本语言Groovy 2019-05-15 目录 0. pom.xml添加依赖1. 使用GroovyShell计算表达式2. 使用GroovyScriptEngine脚本引擎加载Gro ...
- 【开源】.Net 动态脚本引擎NScript
开源地址: https://git.oschina.net/chejiangyi/NScript 开源QQ群: .net 开源基础服务 238543768 .Net 动态脚本引擎 NScript ...
- 小试牛刀C#作为脚本语言执行解密
背景 我们知道Unity3d是通过C#脚本语言的形式来实现游戏的逻辑代码编写,同样SCOTT服务器也设置了通过C#脚本来实现游戏逻辑,但是本文并不是想真正分析解密他们的运行机制,只是想通过自己的一个需 ...
- JavaScript脚本语言基础(一)
导读: JavaScript代码嵌入HTML文档 JavaScript代码运行方式 第一个实例 JavaScript的三种对话框 定义JavaScript变量 JavaScript运算符和操作符 Ja ...
- Java SE 6 新特性: 对脚本语言的支持
2006 年底,Sun 公司发布了 Java Standard Edition 6(Java SE 6)的最终正式版,代号 Mustang(野马).跟 Tiger(Java SE 5)相比,Musta ...
随机推荐
- ASP.NET Core的身份认证框架IdentityServer4(7)- 使用客户端证书控制API访问
前言 今天(2017-9-8,写于9.8,今天才发布)一口气连续把最后几篇IdentityServer4相关理论全部翻译完了,终于可以进入写代码的过程了,比较累.目前官方的文档和Demo以及一些相关组 ...
- .Netcore之日志组件Log4net、Nlog性能比较
转载请注明出处http://www.cnblogs.com/supernebula/p/7506993.html .Netcore之Log4net.Nlog性能比较 最近在写一个开源.netcore ...
- Android学习记录:线程
在Java中,线程的建立方法如下. 新建一个类,接口Runnable,重载 run方法 import javax.swing.JTextField; public class test impleme ...
- select 标签选中 jquery
网上很多错误 的[text ='xxx'] ,我晕. option 标签没有 text 属性.所以[]选取不到. 正确的: $("#yearCardTypeState option:cont ...
- vi/vim键盘图-
vi/vim键盘图-----又一张桌面背景好图 也许还是有很多人不能愿意用CLI的vi/Vim来写东西,不过,当你真的习惯了,它的高效性就是不可估量了.下面的这张图,一看就明白了,从此,学习变的不再艰 ...
- UX是什么?
UX(用户体验),操作过安卓手机或者苹果手机的系统吧?那么操作过程的整体体验就叫UX,而操作过程中所看到的界面颜色啦,图案,字体大小啦等等都属于UI设计,而交互设计(Interaction Desig ...
- 团队作业4——第一次项目冲刺(Alpha版本) 4.24
团队作业4--第一次项目冲刺(Alpha版本) Day four: 会议照片 每日站立会议: 项目进展 今天是项目的Alpha敏捷冲刺的第三天,先大概整理下昨天已完成的任务以及今天计划完成的任务.今天 ...
- 201521123056《Java程序设计》 第2周学习总结
1. 本周学习总结 String类: 不可变字符串型: 粗略介绍了枚举类型: 完全限定类名: 泛型数组列表的应用: 2. 书面作业 Q1.使用Eclipse关联jdk源代码,并查看String对象的源 ...
- 201521123095 《Java程序设计》第1周学习总结
1. 本周学习总结 开始了对JAVA的初步了解和学习,了解了如何编写简单的JAVA程序. 了解了Java的诞生及发展以及如何运用JVN JRE JDK JVM让JAVA可以 ...
- 201521123006 《java程序设计》 第10周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异常.多线程 1.finally 题目4-2 1.1 截图你的提交结果(出 ...