<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      控件開發基礎

      博客園 首頁 新隨筆 聯系 訂閱 管理

      原文地址:http://www.rzrgm.cn/feiyuhuo/p/5474790.html

      方法一

      使用微軟官方組件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
          {
              /// <summary>
              /// 腳本類型
              /// </summary>
              public enum ScriptLanguage
              {
      
                  /// <summary>
                  /// JScript腳本語言
                  /// </summary>
                  JScript,
                  /// <summary>
                  /// VBscript腳本語言
                  /// </summary>
                  VBscript,
                  /// <summary>
                  /// JavaScript腳本語言
                  /// </summary>
                  JavaScript
      
              }
              /// <summary>
              /// 腳本運行錯誤代理
              /// </summary>
              public delegate void RunErrorHandler();
              /// <summary>
              /// 腳本運行超時代理
              /// </summary>
              public delegate void RunTimeoutHandler();
              /// <summary>
              /// ScriptEngine類
              /// </summary>
              public class ScriptEngine
              {
                  private ScriptControl msc;
                  /// <summary>
                  /// 定義腳本運行錯誤事件
                  /// </summary>
                  public event RunErrorHandler RunError;
                  /// <summary>
                  /// 定義腳本運行超時事件
                  /// </summary>
                  public event RunTimeoutHandler RunTimeout;
      
                  /// <summary>
                  ///構造函數 默認為 VBscript 腳本類型
                  /// </summary>
                  public ScriptEngine()
                      : this(ScriptLanguage.VBscript)
                  { }
                  /// <summary>
                  /// 構造函數
                  /// </summary>
                  /// <param name="language">腳本類型</param>
                  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);
                  }
      
                  /// <summary>
                  /// 運行Eval方法
                  /// </summary>
                  /// <param name="expression">表達式</param>
                  /// <param name="codeBody">函數體</param>
                  /// <returns>返回值object</returns>
                  public object Eval(string expression, string codeBody)
                  {
                      msc.AddCode(codeBody);
                      return msc.Eval(expression);
                  }
                  /// <summary>
                  /// 運行Eval方法
                  /// </summary>
                  /// <param name="language">腳本語言</param>
                  /// <param name="expression">表達式</param>
                  /// <param name="codeBody">函數體</param>
                  /// <returns>返回值object</returns>
                  public object Eval(ScriptLanguage language, string expression, string codeBody)
                  {
                      if (this.Language != language)
                          this.Language = language;
                      return Eval(expression, codeBody);
                  }
      
      
                
                  /// <summary>
                  /// 運行Run方法
                  /// </summary>
                  /// <param name="mainFunctionName">入口函數名稱 例如:add</param>
                  /// <param name="parameters">參數:例如:new object(){"",""}</param>
                  /// <param name="codeBody">函數體 例如:fucniton add(int a,int b){return a+b;}</param>
                  /// <returns>返回值object:獲取object.Tostring()</returns>
                  public object Run(string mainFunctionName, object[] parameters, string codeBody)
                  {
                      this.msc.AddCode(codeBody);
                      return msc.Run(mainFunctionName,  parameters);
                  }
      
                  /// <summary>
                  /// 運行Run方法
                  /// </summary>
                  /// <param name="language">腳本語言</param>
                  /// <param name="mainFunctionName">入口函數名稱</param>
                  /// <param name="parameters">參數</param>
                  /// <param name="codeBody">函數體</param>
                  /// <returns>返回值object</returns>
                  public object Run(ScriptLanguage language, string mainFunctionName, object[] parameters, string codeBody)
                  {
                      if (this.Language != language)
                          this.Language = language;
                      return Run(mainFunctionName, parameters, codeBody);
                  }
      
                  /// <summary>
                  /// 放棄所有已經添加到 ScriptControl 中的 Script 代碼和對象
                  /// </summary>
                  public void Reset()
                  {
                      this.msc.Reset();
                  }
                  /// <summary>
                  /// 獲取或設置腳本語言
                  /// </summary>
                  public ScriptLanguage Language
                  {
                      get { return (ScriptLanguage)Enum.Parse(typeof(ScriptLanguage), this.msc.Language, false); }
                      set { this.msc.Language = value.ToString(); }
                  }
      
                  /// <summary>
                  /// 獲取或設置腳本執行時間,單位為毫秒
                  /// </summary>
                  public int Timeout
                  {
                      get { return 0; }
                  }
      
                  /// <summary>
                  /// 設置是否顯示用戶界面元素
                  /// </summary>
                  public bool AllowUI
                  {
                      get { return this.msc.AllowUI; }
                      set { this.msc.AllowUI = value; }
                  }
      
                  /// <summary>
                  /// 宿主應用程序是否有保密性要求
                  /// </summary>
                  public bool UseSafeSubset
                  {
                      get { return this.msc.UseSafeSubset; }
                      set { this.msc.UseSafeSubset = true; }
                  }
      
                  /// <summary>
                  /// RunError事件激發
                  /// </summary>
                  private void OnError()
                  {
                      if (RunError != null)
                          RunError();
                  }
      
                  /// <summary>
                  /// OnTimeout事件激發
                  /// </summary>
                  private void OnTimeout()
                  {
                      if (RunTimeout != null)
                          RunTimeout();
                  }
              }
      
      
          }
      }
      復制代碼

      缺點: 

      1、必須要添加微軟官方組件Interop.MSScriptControl

      2、不支持開發x64的程序

       

      方法二

      利用反射獲取組件(推薦使用)

      無需引用其它dll文件,實現代碼如下: 

      復制代碼
              /// <summary>
              /// 獲取JS時間戳 13位
              /// </summary>
              /// <returns></returns>
              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="text/javascript" src="http://ui.ptlogin2.qzone.com/js/10141/login_10.js"></script>
      <script type="text/javascript" >
              var result=$.Encryption.getEncryption("bada23","","",!1);
              document.write(result);
      </script>
      <body>
      </body>
      </html>
      復制代碼

      忽略腳本錯誤,設置WebBrowser屬性:

      C#代碼如下:

      復制代碼
      void MainFormLoad(object sender, EventArgs e)
      {
          webBrowser1.DocumentText=File.ReadAllText(@"C:\Users\Administrator\Desktop\abc.html");             
      }
      void Button1Click(object sender, EventArgs e) { MessageBox.Show(webBrowser1.Document.Body.OuterText); }
      復制代碼

      效果如下圖所示:

       

      補充

      WebBrowser與JS交互,JS調用C#方法

      以下補充一下如何使用JS調用C#方法

      C#代碼:

      復制代碼
      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 ="FullTrust")]
          [ComVisible(true)]//COM+組件可見
          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 = this;//具體公開的對象,這里可以公開自定義對象
                  webBrowser1.Navigate(Application.StartupPath + "/dom.html"); 
              }
        
              public void ShowMsg(string msg)
              {
                  MessageBox.Show(msg);           
              }
          }
      }
      復制代碼

      html文件的JS代碼:

      復制代碼
      <html>
        <head>
        </head>
        <body> 
        </body>     
         <script type="text/javascript" charset="utf-8">
              function Run(str)
             {     
                  window.external.ShowMsg(str);
             }
          </script>
      </html>
      復制代碼

      注意的地方:記得給公開對象加上以下標簽屬性

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

      運行結果:

      posted on 2018-04-28 14:34  ada  閱讀(413)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 在线看无码的免费网站| 天堂中文最新版在线官网在线| 中文字幕国产精品日韩| 久久午夜夜伦鲁鲁片免费无码影院 | 国产精品中文av专线| 久青草精品视频在线观看| 日本九州不卡久久精品一区| 99er热精品视频| 最新偷拍一区二区三区| 久久亚洲国产品一区二区| 免费看无码自慰一区二区| 日韩国产精品无码一区二区三区| 国产精品国产三级国av| 精品国产乱子伦一区二区三区| 亚洲av午夜成人片| 中文字幕乱码十国产乱码| 99久久亚洲综合精品成人| 精品久久久久无码| 日韩无矿砖一线二线卡乱| 99久久精品国产一区二区暴力 | 日韩中文字幕人妻精品| 人人做人人爽人人爱| 久久国产精品波多野结衣| 91麻豆亚洲国产成人久久| 久热这里只有精品12| 国产超碰无码最新上传| 九九热在线精品视频观看| 99久久精品国产一区二区蜜芽| 久久久av男人的天堂| 啦啦啦视频在线日韩精品| 亚洲精品久荜中文字幕| 久久综合精品国产一区二区三区无 | 亚洲人成色7777在线观看不卡| 久久精品国产精品亚洲精品| 亚洲码和欧洲码一二三四| 18禁免费无码无遮挡网站| 中文字幕亚洲国产精品| 亚洲AV成人一区国产精品| 风流老熟女一区二区三区| 亚洲男女羞羞无遮挡久久丫| 亚洲va中文字幕无码久久|