国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

使用C#解析并運(yùn)行JavaScript代碼

2019-11-17 02:28:58
字體:
供稿:網(wǎng)友

使用C#解析并運(yùn)行javaScript代碼

如果想在C#編程中解析并運(yùn)行Javascript代碼,常見的方式有兩種:

  1. 利用COM組件“Microsoft Script Control”,可參見:C#使用技巧之調(diào)用JS腳本方法一
  2. 利用JScript.net,可參見:C#使用技巧之調(diào)用JS腳本方法二或從命令行編譯 JScript 代碼

這兩種方式都能達(dá)到在C#中執(zhí)行JavaScript代碼的效果,不過各有利弊。 方法一對程序運(yùn)行環(huán)境有要求,程序只能以x86為目標(biāo)平臺。方法二實(shí)際是將JavaScript代碼編譯成為了.NET程序集,對JavaScript代碼有嚴(yán)格的格式要求,但是可以在任意平臺發(fā)布(支持跨平臺)。 除此之外,其實(shí)還有另一種方法來實(shí)現(xiàn)這個(gè)功能,兼容x86和x64平臺,不過僅限于在Windows下使用。而且對JavaScript代碼沒有嚴(yán)格的格式要求。

Windows Script Engines

Microsoft® Windows® Script Interfaces introduce a new way for an application to add scripting and OLE Automation capabilities. With the advent of the interfaces, hosts can call upon disparate scripting engines from multiple sources and vendors to perform scripting between components. The implementation of the script itself—language, syntax, persistent format, execution model, and so on—is left to the script vendor. The designers have taken care to allow hosts that rely on Windows Script to use arbitrary language back ends.

以上是微軟對Windows Script Engines的官方解釋,詳細(xì)信息可以參看:Microsoft Windows Script Interfaces - Introduction。簡單的說,Windows Script Engines 提供了一種新的方式,讓我們可以為應(yīng)用程序添加腳本功能。 所以我們只需要將Windows Script Engines進(jìn)行包裝即可。

調(diào)用示例

1、直接執(zhí)行表達(dá)式:

Console.WriteLine(ScriptEngine.Eval("jscript", "1+2/3"));

將會輸出:1.66666666666667

2、調(diào)用有參數(shù)的方法:

using (ScriptEngine engine = new ScriptEngine("jscript")){  ParsedScript parsed = engine.Parse("function MyFunc(x){return 1+2+x}");  Console.WriteLine(parsed.CallMethod("MyFunc", 3));}

將會輸出:6

3、調(diào)用可選參數(shù)NameItem方法:

using (ScriptEngine engine = new ScriptEngine("jscript")){    ParsedScript parsed = engine.Parse("function MyFunc(x){return 1+2+x+My.Num}");    MyItem item = new MyItem();    item.Num = 4;    engine.SetNamedItem("My", item);    Console.WriteLine(parsed.CallMethod("MyFunc", 3));}[ComVisible(true)] // Script engines are COM components.public class MyItem{    public int Num { get; set; }}

將會輸出:10

如果宿主服務(wù)中安裝有IE9+的瀏覽器,那么我們可以調(diào)用更快的JavaScript引擎"chakra":

using (ScriptEngine engine = new ScriptEngine("{16d51579-a30b-4c8b-a276-0ff4dc41e755}")){    // continue with chakra now}

ScriptEngine.cs

上面只是部分的調(diào)用示例,但是應(yīng)該可以滿足80%的業(yè)務(wù)需求。上面的代碼依賴于ScriptEngine類,完整的ScriptEngine.cs代碼如下:

/// <summary>/// RePResents a Windows Script Engine such as JScript, VBScript, etc./// </summary>public sealed class ScriptEngine : IDisposable{    /// <summary>    /// The name of the function used for simple evaluation.    /// </summary>    public const string MethodName = "EvalMethod";    /// <summary>    /// The default scripting language name.    /// </summary>    public const string DefaultLanguage = JavaScriptLanguage;    /// <summary>    /// The JavaScript or jscript scripting language name.    /// </summary>    public const string JavaScriptLanguage = "javascript";    /// <summary>    /// The javascript or jscript scripting language name.    /// </summary>    public const string VBScriptLanguage = "vbscript";    /// <summary>    /// The chakra javascript engine CLSID. The value is {16d51579-a30b-4c8b-a276-0ff4dc41e755}.    /// </summary>    public const string ChakraClsid = "{16d51579-a30b-4c8b-a276-0ff4dc41e755}";    private IActiveScript _engine;    private IActiveScriptParse32 _parse32;    private IActiveScriptParse64 _parse64;    internal ScriptSite Site;    private Version _version;    private string _name;    [Guid("BB1A2AE1-A4F9-11cf-8F20-00805F2CD064"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]    private interface IActiveScript    {        [PreserveSig]        int SetScriptSite(IActiveScriptSite pass);        [PreserveSig]        int GetScriptSite(Guid riid, out IntPtr site);        [PreserveSig]        int SetScriptState(ScriptState state);        [PreserveSig]        int GetScriptState(out ScriptState scriptState);        [PreserveSig]        int Close();        [PreserveSig]        int AddNamedItem(string name, ScriptItem flags);        [PreserveSig]        int AddTypeLib(Guid typeLib, uint major, uint minor, uint flags);        [PreserveSig]        int GetScriptDispatch(string itemName, out IntPtr dispatch);        [PreserveSig]        int GetCurrentScriptThreadID(out uint thread);        [PreserveSig]        int GetScriptThreadID(uint win32ThreadId, out uint thread);        [PreserveSig]        int GetScriptThreadState(uint thread, out ScriptThreadState state);        [PreserveSig]        int InterruptScriptThread(uint thread, out System.Runtime.InteropServices.ComTypes.EXCEPINFO exceptionInfo, uint flags);        [PreserveSig]        int Clone(out IActiveScript script);    }    [Guid("4954E0D0-FBC7-11D1-8410-006008C3FBFC"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]    private interface IActiveScriptProperty    {        [PreserveSig]        int GetProperty(int dwProperty, IntPtr pvarIndex, out object pvarValue);        [PreserveSig]        int SetProperty(int dwProperty, IntPtr pvarIndex, ref object pvarValue);    }    [Guid("DB01A1E3-A42B-11cf-8F20-00805F2CD064"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]    private interface IActiveScriptSite    {        [PreserveSig]        int GetLCID(out int lcid);        [PreserveSig]        int GetItemInfo(string name, ScriptInfo returnMask, out IntPtr item, IntPtr typeInfo);        [PreserveSig]        int GetDocVersionString(out string version);        [PreserveSig]        int OnScriptTerminate(object result, System.Runtime.InteropServices.ComTypes.EXCEPINFO exceptionInfo);        [PreserveSig]        int OnStateChange(ScriptState scriptState);        [PreserveSig]        int OnScriptError(IActiveScriptError scriptError);        [PreserveSig]        int OnEnterScript();        [PreserveSig]        int OnLeaveScript();    }    [Guid("EAE1BA61-A4ED-11cf-8F20-00805F2CD064"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]    private interface IActiveScriptError    {        [PreserveSig]        int GetExceptionInfo(out System.Runtime.InteropServices.ComTypes.EXCEPINFO exceptionInfo);        [PreserveSig]        int GetSourcePosition(out uint sourceContext, out int lineNumber, out int characterPosition);        [PreserveSig]        int GetSourceLineText(out string sourceLine);    }    [Guid("BB1A2AE2-A4F9-11cf-8F20-00805F2CD064"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]    private interface IActiveScriptParse32    {        [PreserveSig]        int InitNew();        [PreserveSig]        int AddScriptlet(string defaultName, string code, string itemName, string subItemName, string eventName, string delimiter, IntPtr sourceContextCookie, uint startingLineNumber, ScriptText flags, out string name, out System.Runtime.InteropServices.ComTypes.EXCEPINFO exceptionInfo);        [PreserveSig]        int ParseScriptText(string code, string itemName, IntPtr context, string delimiter, int sourceContextCookie, uint startingLineNumber, ScriptText flags, out object result, out System.Runtime.InteropServices.ComTypes.EXCEPINFO exceptionInfo);    }    [Guid("C7EF7658-E1EE-480E-97EA-D52CB4D76D17"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]    private interface IActiveScriptParse64    {        [PreserveSig]        int InitNew();        [PreserveSig]        int AddScriptlet(string defaultName, string code, string itemName, string subItemName, string eventName, string delimiter, IntPtr sourceContextCookie, uint startingLineNumber, ScriptText flags, out string name, out System.Runtime.InteropServices.ComTypes.EXCEPINFO exceptionInfo);        [PreserveSig]        int ParseScriptText(string code, string itemName, IntPtr context, string delimiter, long sourceContextCookie, uint startingLineNumber, ScriptText flags, out object result, out System.Runtime.InteropServices.ComTypes.EXCEPINFO exceptionInfo);    }    [Flags]    private enum ScriptText    {        None = 0,        //DelayExecution = 1,        //IsVisible =
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 许昌市| 甘泉县| 溧水县| 彩票| 吴桥县| 衡水市| 元氏县| 鄂州市| 临桂县| 嘉善县| 罗甸县| 金山区| 平果县| 徐汇区| 武定县| 奉化市| 安仁县| 翼城县| 泗洪县| 开封市| 泸定县| 庄浪县| 玛曲县| 察隅县| 象州县| 江陵县| 广西| 庆城县| 从化市| 高要市| 平邑县| 罗城| 上杭县| 岳普湖县| 布尔津县| 繁峙县| 阜康市| 冀州市| 普定县| 郑州市| 伊吾县|