热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

方法一使用微软官方组件Interop.MSScriptControl1.msscript.ocx下载的地址http:www.microsoft.comdownloadsdetail

方法一

使用微软官方组件Interop.MSScriptControl

1.msscript.ocx下载的地址   http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=D05FCF37-4D9F-4769-9442-0BCEEF907033

   或者点击此处下载 Interop.MSScriptControl.dll

2.项目中引用 msscript.ocx 或者 Interop.MSScriptControl.dll

现在通过这个组件的一些方法来执行JS代码,并接收方法执行后的返回值,实现代码如下:

ScriptControlClass sc = new ScriptControlClass(); //申明变量
sc.UseSafeSubset = true; //允许执行不安全的代码
sc.Language = "Javascript"; //表示需要解析的语言为Javascript
sc.AddCode(Properties.Resources.GetTimes); // Properties.Resources 资源文件
string str = sc.Run("time", new object[] { "time()" }).ToString(); //第一个参数为要执行的方法名,第二个参数为方法体的传入参数,特别注意的是当JS方法中没有传入参数时,这时传递的为该方法名称,不填写的话会抛异常。然后将JS方法执行后的返回结果存储在变量str中

以下代码将组件的常用属性以及方法封装成单独的类,方便调用。 

using System;
using MSScriptControl;
using System.Text;//导入js文件,导入js 方法字符串,然后执行js方法。 通过msscript.ocx控件执行JS脚本 ,先引用 Interop.MSScriptControl.dll
//官网下载: 然后 引用 xxx.ocx就行了 http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=D05FCF37-4D9F-4769-9442-0BCEEF907033
namespace csharp中执行js方法
{
class script_run{///

/// 脚本类型/// public enum ScriptLanguage{/// /// JScript脚本语言///
JScript,/// /// Vbscript脚本语言///
Vbscript,/// /// Javascript脚本语言///
Javascript}/// /// 脚本运行错误代理/// public delegate void RunErrorHandler();/// /// 脚本运行超时代理/// public delegate void RunTimeoutHandler();/// /// ScriptEngine类/// public class ScriptEngine{private ScriptControl msc;/// /// 定义脚本运行错误事件/// public event RunErrorHandler RunError;/// /// 定义脚本运行超时事件/// public event RunTimeoutHandler RunTimeout;/// ///构造函数 默认为 Vbscript 脚本类型/// public ScriptEngine(): this(ScriptLanguage.Vbscript){ }/// /// 构造函数/// /// 脚本类型public ScriptEngine(ScriptLanguage language){this.msc = new ScriptControlClass();this.msc.UseSafeSubset = true;this.msc.Language = language.ToString();((DScriptControlSource_Event)this.msc).Error += new DScriptControlSource_ErrorEventHandler(OnError);((DScriptControlSource_Event)this.msc).Timeout += new DScriptControlSource_TimeoutEventHandler(OnTimeout);}/// /// 运行Eval方法/// /// 表达式/// 函数体/// 返回值objectpublic object Eval(string expression, string codeBody){msc.AddCode(codeBody);return msc.Eval(expression);}/// /// 运行Eval方法/// /// 脚本语言/// 表达式/// 函数体/// 返回值objectpublic object Eval(ScriptLanguage language, string expression, string codeBody){if (this.Language != language)this.Language = language;return Eval(expression, codeBody);}/// /// 运行Run方法/// /// 入口函数名称 例如:add/// 参数:例如:new object(){"",""}/// 函数体 例如:fucniton add(int a,int b){return a+b;}/// 返回值object:获取object.Tostring()public object Run(string mainFunctionName, object[] parameters, string codeBody){this.msc.AddCode(codeBody);return msc.Run(mainFunctionName, parameters);}/// /// 运行Run方法/// /// 脚本语言/// 入口函数名称/// 参数/// 函数体/// 返回值objectpublic object Run(ScriptLanguage language, string mainFunctionName, object[] parameters, string codeBody){if (this.Language != language)this.Language = language;return Run(mainFunctionName, parameters, codeBody);}/// /// 放弃所有已经添加到 ScriptControl 中的 Script 代码和对象/// public void Reset(){this.msc.Reset();}/// /// 获取或设置脚本语言/// public ScriptLanguage Language{get { return (ScriptLanguage)Enum.Parse(typeof(ScriptLanguage), this.msc.Language, false); }set { this.msc.Language = value.ToString(); }}/// /// 获取或设置脚本执行时间,单位为毫秒/// public int Timeout{get { return 0; }}/// /// 设置是否显示用户界面元素/// public bool AllowUI{get { return this.msc.AllowUI; }set { this.msc.AllowUI = value; }}/// /// 宿主应用程序是否有保密性要求/// public bool UseSafeSubset{get { return this.msc.UseSafeSubset; }set { this.msc.UseSafeSubset = true; }}/// /// RunError事件激发/// private void OnError(){if (RunError != null)RunError();}/// /// OnTimeout事件激发/// private void OnTimeout(){if (RunTimeout != null)RunTimeout();}}}
}

缺点: 

1、必须要添加微软官方组件Interop.MSScriptControl

2、不支持开发x64的程序

 

方法二

利用反射获取组件(推荐使用)

无需引用其它dll文件,实现代码如下: 

///

/// 获取JS时间戳 13位/// /// public string GetTimeByJs(){Type obj = Type.GetTypeFromProgID("ScriptControl");if (obj == null) return null;object ScriptControl = Activator.CreateInstance(obj);obj.InvokeMember("Language", BindingFlags.SetProperty, null, ScriptControl, new object[] { "Javascript" });string js = "function time(a, b, msg){ var sum = a + b; return new Date().getTime() + ': ' + msg + ' = ' + sum }";obj.InvokeMember("AddCode", BindingFlags.InvokeMethod, null, ScriptControl, new object[] { js });return obj.InvokeMember("Eval", BindingFlags.InvokeMethod, null, ScriptControl, new object[] { "time(a, b, 'a + b')" }).ToString();}

注意事项:在JS方法中传递的参数如果是字符串,参数需要使用引号括起来,否则不需要。

 

区别:   

1、方法一需要引用dll文件,方法二不需要引用dll文件;

2、方法一不支持开发x64的程序,方法二支持;

3、执行JS方法时,如果传入的参数是字符串时,在方法二中必须要使用引号括起来,否则不需要,而方法一给JS方法传参无需使用括号。

 

方法三

利用WebBrowser调用空间加密JS直接获取结果

根据参数自己生成html代码,然后交给WebBrowser执行。html文件的代码如下:

DOCTYPE html>
<html>
<script type&#61;"text/Javascript" src&#61;"http://ui.ptlogin2.qzone.com/js/10141/login_10.js">script>
<script type&#61;"text/Javascript" >var result&#61;$.Encryption.getEncryption("bada23","","",!1);document.write(result);
script>
<body>
body>
html>

忽略脚本错误&#xff0c;设置WebBrowser属性&#xff1a;

C#代码如下&#xff1a;

void MainFormLoad(object sender, EventArgs e)
{webBrowser1.DocumentText
&#61;File.ReadAllText(&#64;"C:\Users\Administrator\Desktop\abc.html");
}
void Button1Click(object sender, EventArgs e)
{MessageBox.Show(webBrowser1.Document.Body.OuterText);
}

效果如下图所示&#xff1a;

 

补充

WebBrowser与JS交互&#xff0c;JS调用C#方法

以下补充一下如何使用JS调用C#方法

C#代码&#xff1a;

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Runtime.InteropServices;
using System.Security.Permissions;namespace test
{ [PermissionSet(SecurityAction.Demand, Name
&#61;"FullTrust")][ComVisible(true)]//COM&#43;组件可见public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){webBrowser1.Document.InvokeScript("Run", new object[] { "CShareFunction" });}private void Form1_Load(object sender, EventArgs e){ webBrowser1.ObjectForScripting &#61; this;//具体公开的对象,这里可以公开自定义对象webBrowser1.Navigate(Application.StartupPath &#43; "/dom.html"); }public void ShowMsg(string msg){MessageBox.Show(msg); }}
}

html文件的JS代码&#xff1a;

<html><head>head><body> body> <script type&#61;"text/Javascript" charset&#61;"utf-8">function Run(str){ window.external.ShowMsg(str);}script>
html>

注意的地方&#xff1a;记得给公开对象加上以下标签属性

[PermissionSet(SecurityAction.Demand, Name &#61;"FullTrust")]
[ComVisible(
true)]

运行结果&#xff1a;

 

 

出处&#xff1a;https://www.cnblogs.com/feiyuhuo/p/5474790.html

转:https://www.cnblogs.com/mq0036/p/10406891.html



推荐阅读
  • 如题:encode32(bin216(Base32.encrypt(1111,ODQ5OTkw)));varBase32newfunction(){varde ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 渗透测试基础bypass绕过阻挡我们的WAF(下)
    渗透测试基础-bypass ... [详细]
  • 支付宝老的wap支付接口支付交易处理失败,请稍后再试。(ALI14)
    支付宝老的wap支付接口支付交易处理失败,请稍后再试。(ALI14)service:alipay.wap.trade.c ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • java布尔字段用is前缀_POJO类中布尔类型的变量都不要加is前缀详解
    前言对应阿里巴巴开发手册第一章的命名风格的第八条。【强制】POJO类中布尔类型的变量都不要加is前缀,否则部分框架解析会引起序列化错误。反例:定义为基本 ... [详细]
  • Java开发人员知道Java语言并不总是每种任务的最佳语言。今年的JRuby和Groovy的1.0版本发行了对向Java应用程序添加动态语言的兴趣。借助Groovy, ... [详细]
  • 0.Linux环境搭建 ... [详细]
  • web快速入门基础
    web快速入门基础1.nginx介绍nginx:engineX,是由1994年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯rambler.ru公司开发的,开发工作最早从2002 ... [详细]
author-avatar
yuanyuan
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有