在.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#计算时间,悲剧啊):

结论:

  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. JAVA简单Swing图形界面应用演示样例

    JAVA简单Swing图形界面应用演示样例 package org.rui.hello; import javax.swing.JFrame; /** * 简单的swing窗体 * @author l ...

  2. WebBrowser一点心得,如果在Javascript和Winform代码之间实现双向通信

    原文:WebBrowser一点心得,如果在Javascript和Winform代码之间实现双向通信 最近工作需要,学习了一下winform内嵌webbrowser控件,然后与htm页面中的javasc ...

  3. Microsoft dotnetConf 2015

    Microsoft dotnetConf 2015 一些整理   dotnetConf 2015 直播计划: 第一天 (10 个主讲) - .NET Product Teams 主讲人为 .NET 产 ...

  4. lcc之内存分配

    现在感觉这本书有些地方没有说透,如果自己的理解能力与基础知识够强的话,理解起来还好,如果不行的话,某些地方理解起来会相当的头疼. 现在来说说内存管理.当初看这一章的时候很快就过去了,感觉很多地方很好理 ...

  5. ASP.NET状态服务及session丢失问题解决方案总结

    原文:ASP.NET状态服务及session丢失问题解决方案总结[转载] asp.net Session的实现: asp.net的Session是基于HttpModule技术做的,HttpModule ...

  6. 超高性能的json序列化

    超高性能的json序列化之MVC中使用Json.Net 超高性能的json序列化之MVC中使用Json.Net 先不废话,直接上代码 Asp.net MVC自带Json序列化 1 /// <su ...

  7. linux通过建模工具Umbrello

    https://umbrello.kde.org/ Umbrello UML Modeller is a Unified Modelling Language (UML) diagram progra ...

  8. OCP-1Z0-051-题目解析-第4题

    4. Which two statements are true regarding single row functions? (Choose two.) A. They a ccept only ...

  9. Windows在结构FTPserver

    同Windows8 案件,结构介绍 FTPserver脚步: 1.为Windows开启FTP功能:控制面板->程序->启用或关闭Windows功能.将下图所看到的的复选框选中 waterm ...

  10. 使用Windows2003创建DNS服务器 - 进阶者系列 - 学习者系列文章

    Windows 2003的DNS服务器的配置还是比较简单的.下面简要介绍下DNS服务器的配置. 1.    打开控制面板,选择 添加删除Windows组件,选择 网络服务 ,选择 详细信息,选择 域名 ...