C# 解析js方法,並調用js方法


本文不是基於B/S的 后台調用前台js方法,而是給你一段js方法字符串,讓你在程序中直接解析這段方法,並調用方法得到想要的值。

 

首先要解析Js方法,可以用微軟的msscript.ocx控件(Interop.MSScriptControl.dll)來解析js方法.

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方法,並調用js方法返回值。

 

不過這兒可以將控件類的一些屬性和方法封裝成單獨的類,方便自己調用。  封裝成ScriptEngine類。

 

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();
}
}


}
}

 

 

開始解析js方法。

假如有個js方法:  function  add(var a){return a+1;}

通過上面的ScriptEngine類調用 js:add 方法

 

*********************************************************************

 

//聲明是Javascript方法

script_run.ScriptEngine myScript = new script_run.ScriptEngine(script_run.ScriptLanguage.JavaScript); 

//js字符串

string  javascriptString=”function add(var a){return a+1;} function test(){}”;

object jsmethodRunValue = myScript.Run("add", new object[] {“3”}, javascriptString);
Console.WriteLine(jsmethodRunValue.ToString());

Console.ReadLine();

 

*********************************************************************************


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM