方法一

使用微软官方组件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代码,并接收方法执行后的返回值,实现代码如下:

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

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

  1. using System;
  2. using MSScriptControl;
  3. using System.Text;
  4.  
  5. //导入js文件,导入js 方法字符串,然后执行js方法。 通过msscript.ocx控件执行JS脚本 ,先引用 Interop.MSScriptControl.dll
  6. //官网下载: 然后 引用 xxx.ocx就行了 http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=D05FCF37-4D9F-4769-9442-0BCEEF907033
  7. namespace csharp中执行js方法
  8. {
  9. class script_run
  10. {
  11. /// <summary>
  12. /// 脚本类型
  13. /// </summary>
  14. public enum ScriptLanguage
  15. {
  16.  
  17. /// <summary>
  18. /// JScript脚本语言
  19. /// </summary>
  20. JScript,
  21. /// <summary>
  22. /// VBscript脚本语言
  23. /// </summary>
  24. VBscript,
  25. /// <summary>
  26. /// JavaScript脚本语言
  27. /// </summary>
  28. JavaScript
  29.  
  30. }
  31. /// <summary>
  32. /// 脚本运行错误代理
  33. /// </summary>
  34. public delegate void RunErrorHandler();
  35. /// <summary>
  36. /// 脚本运行超时代理
  37. /// </summary>
  38. public delegate void RunTimeoutHandler();
  39. /// <summary>
  40. /// ScriptEngine类
  41. /// </summary>
  42. public class ScriptEngine
  43. {
  44. private ScriptControl msc;
  45. /// <summary>
  46. /// 定义脚本运行错误事件
  47. /// </summary>
  48. public event RunErrorHandler RunError;
  49. /// <summary>
  50. /// 定义脚本运行超时事件
  51. /// </summary>
  52. public event RunTimeoutHandler RunTimeout;
  53.  
  54. /// <summary>
  55. ///构造函数 默认为 VBscript 脚本类型
  56. /// </summary>
  57. public ScriptEngine()
  58. : this(ScriptLanguage.VBscript)
  59. { }
  60. /// <summary>
  61. /// 构造函数
  62. /// </summary>
  63. /// <param name="language">脚本类型</param>
  64. public ScriptEngine(ScriptLanguage language)
  65. {
  66. this.msc = new ScriptControlClass();
  67. this.msc.UseSafeSubset = true;
  68. this.msc.Language = language.ToString();
  69. ((DScriptControlSource_Event)this.msc).Error += new DScriptControlSource_ErrorEventHandler(OnError);
  70. ((DScriptControlSource_Event)this.msc).Timeout += new DScriptControlSource_TimeoutEventHandler(OnTimeout);
  71. }
  72.  
  73. /// <summary>
  74. /// 运行Eval方法
  75. /// </summary>
  76. /// <param name="expression">表达式</param>
  77. /// <param name="codeBody">函数体</param>
  78. /// <returns>返回值object</returns>
  79. public object Eval(string expression, string codeBody)
  80. {
  81. msc.AddCode(codeBody);
  82. return msc.Eval(expression);
  83. }
  84. /// <summary>
  85. /// 运行Eval方法
  86. /// </summary>
  87. /// <param name="language">脚本语言</param>
  88. /// <param name="expression">表达式</param>
  89. /// <param name="codeBody">函数体</param>
  90. /// <returns>返回值object</returns>
  91. public object Eval(ScriptLanguage language, string expression, string codeBody)
  92. {
  93. if (this.Language != language)
  94. this.Language = language;
  95. return Eval(expression, codeBody);
  96. }
  97.  
  98. /// <summary>
  99. /// 运行Run方法
  100. /// </summary>
  101. /// <param name="mainFunctionName">入口函数名称 例如:add</param>
  102. /// <param name="parameters">参数:例如:new object(){"",""}</param>
  103. /// <param name="codeBody">函数体 例如:fucniton add(int a,int b){return a+b;}</param>
  104. /// <returns>返回值object:获取object.Tostring()</returns>
  105. public object Run(string mainFunctionName, object[] parameters, string codeBody)
  106. {
  107. this.msc.AddCode(codeBody);
  108. return msc.Run(mainFunctionName, parameters);
  109. }
  110.  
  111. /// <summary>
  112. /// 运行Run方法
  113. /// </summary>
  114. /// <param name="language">脚本语言</param>
  115. /// <param name="mainFunctionName">入口函数名称</param>
  116. /// <param name="parameters">参数</param>
  117. /// <param name="codeBody">函数体</param>
  118. /// <returns>返回值object</returns>
  119. public object Run(ScriptLanguage language, string mainFunctionName, object[] parameters, string codeBody)
  120. {
  121. if (this.Language != language)
  122. this.Language = language;
  123. return Run(mainFunctionName, parameters, codeBody);
  124. }
  125.  
  126. /// <summary>
  127. /// 放弃所有已经添加到 ScriptControl 中的 Script 代码和对象
  128. /// </summary>
  129. public void Reset()
  130. {
  131. this.msc.Reset();
  132. }
  133. /// <summary>
  134. /// 获取或设置脚本语言
  135. /// </summary>
  136. public ScriptLanguage Language
  137. {
  138. get { return (ScriptLanguage)Enum.Parse(typeof(ScriptLanguage), this.msc.Language, false); }
  139. set { this.msc.Language = value.ToString(); }
  140. }
  141.  
  142. /// <summary>
  143. /// 获取或设置脚本执行时间,单位为毫秒
  144. /// </summary>
  145. public int Timeout
  146. {
  147. get { return ; }
  148. }
  149.  
  150. /// <summary>
  151. /// 设置是否显示用户界面元素
  152. /// </summary>
  153. public bool AllowUI
  154. {
  155. get { return this.msc.AllowUI; }
  156. set { this.msc.AllowUI = value; }
  157. }
  158.  
  159. /// <summary>
  160. /// 宿主应用程序是否有保密性要求
  161. /// </summary>
  162. public bool UseSafeSubset
  163. {
  164. get { return this.msc.UseSafeSubset; }
  165. set { this.msc.UseSafeSubset = true; }
  166. }
  167.  
  168. /// <summary>
  169. /// RunError事件激发
  170. /// </summary>
  171. private void OnError()
  172. {
  173. if (RunError != null)
  174. RunError();
  175. }
  176.  
  177. /// <summary>
  178. /// OnTimeout事件激发
  179. /// </summary>
  180. private void OnTimeout()
  181. {
  182. if (RunTimeout != null)
  183. RunTimeout();
  184. }
  185. }
  186.  
  187. }
  188. }

缺点: 

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

2、不支持开发x64的程序

方法二

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

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

  1. /// <summary>
  2. /// 获取JS时间戳 13位
  3. /// </summary>
  4. /// <returns></returns>
  5. public string GetTimeByJs()
  6. {
  7. Type obj = Type.GetTypeFromProgID("ScriptControl");
  8. if (obj == null) return null;
  9. object ScriptControl = Activator.CreateInstance(obj);
  10. obj.InvokeMember("Language", BindingFlags.SetProperty, null, ScriptControl, new object[] { "JavaScript" });
  11. string js = "function time(a, b, msg){ var sum = a + b; return new Date().getTime() + ': ' + msg + ' = ' + sum }";
  12. obj.InvokeMember("AddCode", BindingFlags.InvokeMethod, null, ScriptControl, new object[] { js });
  13. return obj.InvokeMember("Eval", BindingFlags.InvokeMethod, null, ScriptControl, new object[] { "time(a, b, 'a + b')" }).ToString();
  14. }

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

区别:

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

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

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

方法三

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

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

  1. <!DOCTYPE html>
  2. <html>
  3. <script type="text/javascript" src="http://ui.ptlogin2.qzone.com/js/10141/login_10.js"></script>
  4. <script type="text/javascript" >
  5. var result=$.Encryption.getEncryption("bada23","","",!1);
  6. document.write(result);
  7. </script>
  8. <body>
  9. </body>
  10. </html>

忽略脚本错误,设置WebBrowser属性:

C#代码如下:

  1. void MainFormLoad(object sender, EventArgs e)
  2. {
  3. webBrowser1.DocumentText=File.ReadAllText(@"C:\Users\Administrator\Desktop\abc.html");
  4. }
  5. void Button1Click(object sender, EventArgs e)
  6. {
  7. MessageBox.Show(webBrowser1.Document.Body.OuterText);
  8. }

效果如下图所示:

补充

WebBrowser与JS交互,JS调用C#方法

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

C#代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using System.IO;
  9. using System.Runtime.InteropServices;
  10. using System.Security.Permissions;
  11.  
  12. namespace test
  13. {
  14. [PermissionSet(SecurityAction.Demand, Name ="FullTrust")]
  15. [ComVisible(true)]//COM+组件可见
  16. public partial class Form1 : Form
  17. {
  18. public Form1()
  19. {
  20. InitializeComponent();
  21. }
  22.  
  23. private void button1_Click(object sender, EventArgs e)
  24. {
  25. webBrowser1.Document.InvokeScript("Run", new object[] { "CShareFunction" });
  26. }
  27.  
  28. private void Form1_Load(object sender, EventArgs e)
  29. {
  30. webBrowser1.ObjectForScripting = this;//具体公开的对象,这里可以公开自定义对象
  31. webBrowser1.Navigate(Application.StartupPath + "/dom.html");
  32. }
  33.  
  34. public void ShowMsg(string msg)
  35. {
  36. MessageBox.Show(msg);
  37. }
  38. }
  39. }

html文件的JS代码:

  1. <html>
  2. <head>
  3. </head>
  4. <body>
  5. </body>
  6. <script type="text/javascript" charset="utf-8">
  7. function Run(str)
  8. {
  9. window.external.ShowMsg(str);
  10. }
  11. </script>
  12. </html>

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

  1. [PermissionSet(SecurityAction.Demand, Name ="FullTrust")]
  2. [ComVisible(true)]

运行结果:

WinForm程序执行JS代码的多种方法以及使用WebBrowser与JS交互的更多相关文章

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

    方法一 使用微软官方组件Interop.MSScriptControl 1.msscript.ocx下载的地址   http://www.microsoft.com/downloads/details ...

  2. js 代码大全(各种方法、属性)

    事件源对象event.srcElement.tagNameevent.srcElement.type捕获释放event.srcElement.setCapture(); event.srcElemen ...

  3. 判断小数点位数不超过2位的JS代码和在删除确认框里面插JS代码

    <script type="text/javascript"> function checkDecimals(){ var decallowed = 2; var re ...

  4. [搜片神器]winform程序自己如何更新自己的方法代码

    DHT抓取程序开源地址:https://github.com/h31h31/H31DHTDEMO 数据处理程序开源地址:https://github.com/h31h31/H31DHTMgr 国外测试 ...

  5. 微信小程序——详细讲解页面传值(多种方法)

    1.使用navigator的url带参传值 (1)在pageA页面有一个固定的值要传递到pageB页面,比如说一个固定的值user_id要传递给B <navigator url=".. ...

  6. 获取网页js代码的一个方法

    这个是看了别人的代码,稍加修改而成的.怕时间长忘了,在这里记一笔: console.log(require(["foo:bar.js"]).prototype.someMethod ...

  7. winform程序开机自动启动代码

    几天前头儿要我实现程序能开机自动启动,搞好了,整理起来写下来. private void checkBox1_CheckedChanged(object sender, EventArgs e) { ...

  8. highlight.js代码风格引入方法

    <link href="https://cdn.bootcss.com/highlight.js/9.15.10/styles/darcula.min.css" rel=&q ...

  9. 关于后台执行JS代码总结

    方法一.FineUI的 pagecontext对象 string js="functionName();"; PageContext.RegisterStartUpScript(j ...

随机推荐

  1. linux权限补充:rwt rwT rws rwS 特殊权限

    众所周知,Linux的文件权限如: 777:666等,其实只要在相应的文件上加上UID的权限,就可以用到加权限人的身份去运行这个文件.所以我们只需要将bash复制出来到另一个地方,然后用root加上U ...

  2. linux命令学习(一)—— 文件和目录管理命令

    首先需要知道的是命令提示符 [root@localhost ~] # 当前登录用户(root) 主机名(localhost) 当前所在目录(家目录) 超级用户提示符(#) 普通用户提示符($) 1.1 ...

  3. docker-5 docker仓库

    docker部署环境:CentOS release 6.5 (Final) Docker配置文件:/etc/sysconfig/docker  重要参数解释: -H 表示Docker Daemon绑定 ...

  4. netbeans设置语言

    netbeans的界面语言 默认是按系统语言 设的. 想要自己指定的话,加上以下参数就可以了. 中文 --locale zh:CN 英文 --locale en:US 日文 --locale ja:J ...

  5. Android Studio中使用android:src="@drawable/ic_launcher"报错

    今天尝试着安装了Android Studio,界面确实不错,列表什么的也改了很多. 然后新建工程,习惯性在activity_main那里加上一段代码测试看看: <ImageView androi ...

  6. Equinox P2的学习

    product.configuration 点击“Add按钮”并添加以下插件: org.eclipse.equinox.p2.ui org.eclipse.equinox.p2.ui.sdk org. ...

  7. Linux安装Mysql rpm

    1.安装时候会提示与已经安装的RPM包有冲突,所以我们先卸载一些RPM包,要卸载哪些呢?我们要卸载的是包含有mariadb关键字的RPM包,执行命令:rpm -qa|grep mariadb来查看一下 ...

  8. AI (Adobe Illustrator)详细用法(二)

    本文主要是介绍形状的创建与编辑. 一.系列形状工具 1.矩形工具 矩形的作用很大,比如输入框,按钮,图片的大小,比如相片应用中每一个照片占的比例是多大. 初步的UI图的话,会画矩形和圆角矩形就够了. ...

  9. [转]SQL Server 高性能写入的一些总结

    本文转自:http://www.cnblogs.com/rush/archive/2012/08/31/2666090.html 1.1.1 摘要 在开发过程中,我们不时会遇到系统性能瓶颈问题,而引起 ...

  10. 【原创Android游戏】--猜数字游戏V1.1 --数据存储,Intent,SimpleAdapter的学习与应用

    --------------------------------------------------------------- V0.1版本 上次做完第一个版本后,发现还有一些漏洞,并且还有一些可以添 ...