zoukankan      html  css  js  c++  java
  • .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);
            }
        }
    }

    这里用到两个类: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程序集里所有的命名空间。这样会引发脚本的安全性问题,此问题有待解决。。。

    参考资料:   http://www.cnblogs.com/jamesli2015/archive/2011/09/21/2183072.html

                   http://www.codeproject.com/Articles/20760/Script-NET-a-language-for-embedding-scripting-func

          http://www.protsyk.com/scriptdotnet/wiki/index.php?title=ManualContent

  • 相关阅读:
    Spring 学习十五 AOP
    Spring 学习十四 Spring security安全
    博客文格式优化
    作为一名软件测试工程师,需要具备哪些能力
    单元测试工程师需要具备的任职资格
    初识安全测试(一)
    压力测试工具JMeter入门教程
    Jmeter的优点是什么?除了轻量级,它和LoadRunner有什么本质区别
    初识Jmeter(一)
    初识Selenium(四)
  • 原文地址:https://www.cnblogs.com/HopeGi/p/2717149.html
Copyright © 2011-2022 走看看