在.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. Android 4.4 沉浸式透明状态栏与导航栏

    Android 系统自4.2 開始 UI 上就没多大改变,4.4 也仅仅是添加了透明状态栏与导航栏的功能,如图 那么如今我就来给大家解说下怎样使用这个新特性,让你的 app 尾随潮流,当然假设你不在乎 ...

  2. C#函数式编程-序列

    C#函数式编程之序列 过了许久的时间,终于趁闲暇的时间来继续将函数式编程这个专辑连载下去,这段时间开头是为IOS这个新方向做准备,将OC的教程写成了SWIFT版,当然我个人是支持Xamarin,但是我 ...

  3. IOS中TableView的使用(1) -创建一个简单的tableView

    创建一个简单的tableView: #import <UIKit/UIKit.h> /*tableView 一定要遵守这两个协议: UITableViewDataSource,UITabl ...

  4. Spring之SpringMVC前端控制器DispatcherServlet(源码)分析

    1.DispatcherServlet作用说明 DispatcherServlet提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得 ...

  5. Gimp教程:简约手机图标风格

    效果:       在一个国外博客上翻到的图标制作教程,效果类似于Cowon J3的默认图标风格. 制作过程很简单,只需两三步,不多说了,上步骤 Step1.新建50×50的黑色背景 Step2.新建 ...

  6. 安装Windows8.1操作系统 - 初学者系列 - 学习者系列文章

    Windows 8这款操作系统是微软最新的操作系统.虽然微软做了推广,但是据消息称市场份额暂时没那么高.下面就对该操作系统的安装进行简要介绍. 1.  将光盘装入光驱,设置BIOS中光驱启动,启动计算 ...

  7. .NET编程规范

    .NET开发编程规范 第1章 程序的版式 版式虽然不会影响程序的功能,但会影响可读性.程序的版式追求清晰.美观,是程序风格的重要构成因素. 可以把程序的版式比喻为"书法".好的&q ...

  8. linux下的中文编码问题

    很多linux的初学者都会碰到这样一个问题:把windows下的文档拷到linux系统,会出现乱码!其实这涉及到中文编码的问题.linux系统默认的是统一码(utf8).而如果你的文件是big5,显然 ...

  9. ToolBox Analysis & Design

    话说小菜过做已近3年,虽出身PHP后项目大多涉及.net,系统也做得比较繁杂,从常见的CMS,企业OA,ERP,也涉及到电商系统的开发定制,爬虫,工具不一而足,其中web系统居多. 由于表现良好,时常 ...

  10. ODP.NET

    1,什么是ODT?就是Oracle 为 .NET (ODP.NET) 专门编写了 Oracle Data Provider,一个用于 Microsoft .NET 环境下的 Oracle 数据访问 A ...