在.Net中执行js
在.Net中执行js
利用Noesis.Javascript开源组件可以做到在.net中执行js脚本,同时js脚本也能调用C#函数。这个组件的获得方式:在NuGet中输入搜索"Noesis"就能找到。
我们来做个搜索功能:用户能够在textbox中输入js脚本来筛选list记录,界面如下:
然后,click filter button后的UI:
看,筛选出来了,代码如下(js能调C#写的UserInfo类的各个属性)

- public class UserInfo
- {
- public string FirstName { get; set; }
- public string LastName { get; set; }
- public int Age { get; set; }
- public override string ToString()
- {
- return string.Format("{0}, {1}: {2}", FirstName, LastName, Age);
- }
- }
- private void btnSearch_Click(object sender, EventArgs e)
- {
- List<UserInfo> users = FilterUsers(txtFilter.Text.Trim());
- lstUsers.DataSource = users;
- }
- private List<UserInfo> FilterUsers(string jsFilter)
- {
- List<UserInfo> results = new List<UserInfo>();
- if (jsFilter.Trim().Length == 0)
- return this.users;
- try
- {
- using (JavascriptContext context = new JavascriptContext())
- {
- foreach (UserInfo user in this.users)
- {
- context.SetParameter("user", user);
- context.SetParameter("isInclude", false);
- string js = string.Format(@"
- if({0})
- isInclude=true;
- else
- isInclude=false;", jsFilter);
- context.Run(js);
- bool isInclude = (bool)context.GetParameter("isInclude");
- if (isInclude)
- results.Add(user);
- }
- }
- }
- catch
- {
- txtFilter.Focus();
- txtFilter.SelectAll();
- return this.users;
- }
- return results;
- }

我们来看看效率:

- private void btnTest_Click(object sender, EventArgs e)
- {
- using (JavascriptContext context = new JavascriptContext())
- {
- Stopwatch sw = new Stopwatch();
- sw.Start();
- int i=1000000;
- while(i-- > 0)
- {
- context.SetParameter("ii", 1);
- context.SetParameter("jj", 2);
- context.SetParameter("sum", 0);
- string js = string.Format(@"sum=ii+jj;");
- context.Run(js);
- int sum = (int)context.GetParameter("sum");
- }
- sw.Stop();
- long useJS_Total = sw.ElapsedMilliseconds;
- float useJS_Average = ((float)sw.ElapsedMilliseconds) / 1000000;
- sw.Reset();
- sw.Start();
- i = 1000000;
- while (i-- > 0)
- {
- int ii = 1;
- int jj = 2;
- int sum = 0;
- sum = ii + jj;
- }
- sw.Stop();
- long nouseJS_Total = sw.ElapsedMilliseconds;
- float nouseJS_Average = ((float)sw.ElapsedMilliseconds) / 1000000;
- string msg = "";
- msg += string.Format("useJS_Total: {0}\r\n", useJS_Total);
- msg += string.Format("useJS_Average: {0}\r\n\r\n\r\n", useJS_Average);
- msg += string.Format("nouseJS_Total: {0}\r\n", nouseJS_Total);
- msg += string.Format("nouseJS_Average: {0}\r\n\r\n\r\n", nouseJS_Average);
- MessageBox.Show(msg);
- }
- }

结果(上面的是通过js引擎计算的时间、下面的是纯C#计算时间,悲剧啊):
结论:
- 这个Noesis.Javascript只适用于性能要求不高的场合
- 高性能的要看Lua
在.Net中执行js的更多相关文章
- java中执行js代码
要在java中执行js代码,首先明白,java不支持浏览器本身的方法.支持自定义的js方法,否则会报错 先新建一个js文件:jsss.js 内容如下: function aa(a,b){ return ...
- WinForm中执行JS代码(多种方法)
方法一 使用微软官方组件Interop.MSScriptControl 1.msscript.ocx下载的地址 http://www.microsoft.com/downloads/details ...
- pyv8的安装和使用:python中执行js代码
pyv8 的作用是在python中执行js代码,然后可以使用js里的变量等内容.python取得javascript里面的值.javascript取得python里面的值.python和javascr ...
- 在java代码中执行js脚本,实现计算出字符串“(1+2)*(1+3)”的结果
今天在公司项目中,发现一个计算运费的妙招.由于运费规则各种各样,因此写一个公式存到数据库.下次需要计算运费时,直接取出这个公式,把公式的未知变量给替换掉,然后计算出结果就是ok了. 一 ...
- java中执行JS脚本
package 测试包; import javax.script.*; public class SSSSSSSSS { public SSSSSSSSS() { // TODO Auto-gener ...
- a标签中执行js函数
在a标签中调用js函数最适当的方法推荐使用: 1.a href="javascript:void(0);" onclick="js_method()" 这种方法 ...
- Java8中执行js脚本
代码中除了callJSFunctionFromFile函数,其他均转载于文章JDK1.8中如何用ScriptEngine动态执行JS import jdk.nashorn.api.scripting. ...
- 在Java中执行js代码
在某些特定场景下,我们需要用Java来执行Js代码(如模拟登录时,密码被JS加密了的情况),操作如下: ScriptEngineManager mgr = new ScriptEngineManage ...
- 自动化测试中执行JS脚本方法封装
执行JS脚本方法封装: class JavaScript(Base): def execute_javascript(self, js): """执行 JavaScrip ...
随机推荐
- cocos2d-x 移植android竖,横屏设置
AndroidManifest.xml于android:screenOrientation现场控制屏幕方向,默认为横屏 android:screenOrientation="landscap ...
- PHP_零基础学php
现在学习php的工具有很多,所以一般没必要去搭建环境,我用的工具是phpstudy,IDE是Eclipse 1,用php输出一段文字 <html> <head> <tit ...
- Roundabout for jQuery
效果图: Roundabout是一个转换静态HTML元素结构为交互式播放区域的jQuery插件(而且并不仅仅是一个转盘,还有许多的形状) 首先你要下载好Jquery.min.js,和Jquery-Ro ...
- Yii Framework2.0开发教程(10)配合mysql数据库实现用户登录
1.首先在mysql创建一个存用户的表格 create table test_user ( user_id bigint(20) unsigned not null auto_increment co ...
- 【solr这四个主题】在Tomcat 部署Solr4.x
1.安装Tomcat (1)下载并解压缩到/opt/tomcat在 # cd /opt/jediael # tar -zxvf apache-tomcat-7.0.54.tar.gz # mv apa ...
- installshield 32位打包和64位打包的注意事项
原文:installshield 32位打包和64位打包的注意事项 32/64位问题要把握几点:1. 明确你的产品是否需要区分32/64位2. 明确你的产品中是否有32/64位的服务注册3. 了解In ...
- 设计模式学习--Factory Method
What Factory Method:定义一个创建对象的接口,让子类来决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. Why Factory Method是一个比較基 ...
- unity资源
unity资源集中贴 1.unity经验之谈 http://jingyan.baidu.com/article/19192ad820f17be53e570715.html 2.百度网盘,分享了一点模型 ...
- [译]Java 设计模式之迭代器
(文章翻译自java-design-pattern-iterator) 迭代器模式用于迭代遍历一个集合对象.它是一个经常被用到的模式,你可能以前使用过它.不管在任何时候你看见一些方法像hasNext( ...
- leetcode第十题--Regular Expression Matching
Problem:Implement regular expression matching with support for '.' and '*'. '.' Matches any single c ...