在.Net中执行js

利用Noesis.Javascript开源组件可以做到在.net中执行js脚本,同时js脚本也能调用C#函数。这个组件的获得方式:在NuGet中输入搜索"Noesis"就能找到。

我们来做个搜索功能:用户能够在textbox中输入js脚本来筛选list记录,界面如下:

然后,click filter button后的UI:

看,筛选出来了,代码如下(js能调C#写的UserInfo类的各个属性)

  1. public class UserInfo
  2. {
  3. public string FirstName { get; set; }
  4. public string LastName { get; set; }
  5. public int Age { get; set; }
  6. public override string ToString()
  7. {
  8. return string.Format("{0}, {1}: {2}", FirstName, LastName, Age);
  9. }
  10. }
  11.  
  12. private void btnSearch_Click(object sender, EventArgs e)
  13. {
  14. List<UserInfo> users = FilterUsers(txtFilter.Text.Trim());
  15. lstUsers.DataSource = users;
  16. }
  17.  
  18. private List<UserInfo> FilterUsers(string jsFilter)
  19. {
  20. List<UserInfo> results = new List<UserInfo>();
  21. if (jsFilter.Trim().Length == 0)
  22. return this.users;
  23.  
  24. try
  25. {
  26. using (JavascriptContext context = new JavascriptContext())
  27. {
  28. foreach (UserInfo user in this.users)
  29. {
  30. context.SetParameter("user", user);
  31. context.SetParameter("isInclude", false);
  32. string js = string.Format(@"
  33. if({0})
  34. isInclude=true;
  35. else
  36. isInclude=false;", jsFilter);
  37. context.Run(js);
  38. bool isInclude = (bool)context.GetParameter("isInclude");
  39. if (isInclude)
  40. results.Add(user);
  41. }
  42. }
  43. }
  44. catch
  45. {
  46. txtFilter.Focus();
  47. txtFilter.SelectAll();
  48. return this.users;
  49. }
  50.  
  51. return results;
  52. }

我们来看看效率:

  1. private void btnTest_Click(object sender, EventArgs e)
  2. {
  3. using (JavascriptContext context = new JavascriptContext())
  4. {
  5. Stopwatch sw = new Stopwatch();
  6. sw.Start();
  7. int i=1000000;
  8. while(i-- > 0)
  9. {
  10. context.SetParameter("ii", 1);
  11. context.SetParameter("jj", 2);
  12. context.SetParameter("sum", 0);
  13. string js = string.Format(@"sum=ii+jj;");
  14. context.Run(js);
  15. int sum = (int)context.GetParameter("sum");
  16. }
  17. sw.Stop();
  18.  
  19. long useJS_Total = sw.ElapsedMilliseconds;
  20. float useJS_Average = ((float)sw.ElapsedMilliseconds) / 1000000;
  21.  
  22. sw.Reset();
  23. sw.Start();
  24. i = 1000000;
  25. while (i-- > 0)
  26. {
  27. int ii = 1;
  28. int jj = 2;
  29. int sum = 0;
  30. sum = ii + jj;
  31. }
  32. sw.Stop();
  33.  
  34. long nouseJS_Total = sw.ElapsedMilliseconds;
  35. float nouseJS_Average = ((float)sw.ElapsedMilliseconds) / 1000000;
  36.  
  37. string msg = "";
  38. msg += string.Format("useJS_Total: {0}\r\n", useJS_Total);
  39. msg += string.Format("useJS_Average: {0}\r\n\r\n\r\n", useJS_Average);
  40. msg += string.Format("nouseJS_Total: {0}\r\n", nouseJS_Total);
  41. msg += string.Format("nouseJS_Average: {0}\r\n\r\n\r\n", nouseJS_Average);
  42.  
  43. MessageBox.Show(msg);
  44. }
  45. }

结果(上面的是通过js引擎计算的时间、下面的是纯C#计算时间,悲剧啊):

结论:

  1. 这个Noesis.Javascript只适用于性能要求不高的场合
  2. 高性能的要看Lua

在.Net中执行js的更多相关文章

  1. java中执行js代码

    要在java中执行js代码,首先明白,java不支持浏览器本身的方法.支持自定义的js方法,否则会报错 先新建一个js文件:jsss.js 内容如下: function aa(a,b){ return ...

  2. WinForm中执行JS代码(多种方法)

    方法一 使用微软官方组件Interop.MSScriptControl 1.msscript.ocx下载的地址   http://www.microsoft.com/downloads/details ...

  3. pyv8的安装和使用:python中执行js代码

    pyv8 的作用是在python中执行js代码,然后可以使用js里的变量等内容.python取得javascript里面的值.javascript取得python里面的值.python和javascr ...

  4. 在java代码中执行js脚本,实现计算出字符串“(1+2)*(1+3)”的结果

            今天在公司项目中,发现一个计算运费的妙招.由于运费规则各种各样,因此写一个公式存到数据库.下次需要计算运费时,直接取出这个公式,把公式的未知变量给替换掉,然后计算出结果就是ok了. 一 ...

  5. java中执行JS脚本

    package 测试包; import javax.script.*; public class SSSSSSSSS { public SSSSSSSSS() { // TODO Auto-gener ...

  6. a标签中执行js函数

    在a标签中调用js函数最适当的方法推荐使用: 1.a href="javascript:void(0);" onclick="js_method()" 这种方法 ...

  7. Java8中执行js脚本

    代码中除了callJSFunctionFromFile函数,其他均转载于文章JDK1.8中如何用ScriptEngine动态执行JS import jdk.nashorn.api.scripting. ...

  8. 在Java中执行js代码

    在某些特定场景下,我们需要用Java来执行Js代码(如模拟登录时,密码被JS加密了的情况),操作如下: ScriptEngineManager mgr = new ScriptEngineManage ...

  9. 自动化测试中执行JS脚本方法封装

    执行JS脚本方法封装: class JavaScript(Base): def execute_javascript(self, js): """执行 JavaScrip ...

随机推荐

  1. cocos2d-x 移植android竖,横屏设置

    AndroidManifest.xml于android:screenOrientation现场控制屏幕方向,默认为横屏 android:screenOrientation="landscap ...

  2. PHP_零基础学php

    现在学习php的工具有很多,所以一般没必要去搭建环境,我用的工具是phpstudy,IDE是Eclipse 1,用php输出一段文字 <html> <head> <tit ...

  3. Roundabout for jQuery

    效果图: Roundabout是一个转换静态HTML元素结构为交互式播放区域的jQuery插件(而且并不仅仅是一个转盘,还有许多的形状) 首先你要下载好Jquery.min.js,和Jquery-Ro ...

  4. Yii Framework2.0开发教程(10)配合mysql数据库实现用户登录

    1.首先在mysql创建一个存用户的表格 create table test_user ( user_id bigint(20) unsigned not null auto_increment co ...

  5. 【solr这四个主题】在Tomcat 部署Solr4.x

    1.安装Tomcat (1)下载并解压缩到/opt/tomcat在 # cd /opt/jediael # tar -zxvf apache-tomcat-7.0.54.tar.gz # mv apa ...

  6. installshield 32位打包和64位打包的注意事项

    原文:installshield 32位打包和64位打包的注意事项 32/64位问题要把握几点:1. 明确你的产品是否需要区分32/64位2. 明确你的产品中是否有32/64位的服务注册3. 了解In ...

  7. 设计模式学习--Factory Method

    What Factory Method:定义一个创建对象的接口,让子类来决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. Why Factory Method是一个比較基 ...

  8. unity资源

    unity资源集中贴 1.unity经验之谈 http://jingyan.baidu.com/article/19192ad820f17be53e570715.html 2.百度网盘,分享了一点模型 ...

  9. [译]Java 设计模式之迭代器

    (文章翻译自java-design-pattern-iterator) 迭代器模式用于迭代遍历一个集合对象.它是一个经常被用到的模式,你可能以前使用过它.不管在任何时候你看见一些方法像hasNext( ...

  10. leetcode第十题--Regular Expression Matching

    Problem:Implement regular expression matching with support for '.' and '*'. '.' Matches any single c ...