热门标签 | 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



推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • Java_脚本引擎_01_用法入门
    java,脚本,引 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 转载请注明原文地址:http:www.cnblogs.comygj0930p6409067.html1:HammingdistanceTheHammin ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
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社区 版权所有