成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在.NET中使用Javascript作為腳本語言

開發 后端 前端
之前寫過一篇文章,是關于在.NET中,使用v8sharp作為v8Engine的Wraper, 從而在.NET中與Javascript互操作。不過v8Sharp有幾個很大的問題,第一,在參數中傳遞中文字符串會產生亂碼。第二,無法在.NET中,使用.NET對象作為參數傳遞給Javascript。

之前寫過一篇文章,是關于在.NET中,使用v8sharp作為v8Engine的Wraper, 從而在.NET中與Javascript互操作。不過v8Sharp有幾個很大的問題,第一,在參數中傳遞中文字符串會產生亂碼。第二,無法在.NET中,使用.NET對象作為參數傳遞給Javascript。這樣的話,v8Sharp的實用價值就降低了不少。好在v8Engine相當出色,有眾多的.NET開源Wrapper,于是,找到了這款Javascript.NET,可擴展性相當強的Wrapper。

v8Engine

v8Engine是Google Chrome使用的JS解釋引擎, 其執行效率相當的高,根據我自己的測試,是高于IE8,FF3等瀏覽器所使用的JS引擎。目前的最新版本與IE9,FF4的執行效率不相上下。而且Javascript本身是C Style的編程語言,對于我們這種長期使用C、C++和C#的開發人員來說,比LUA等腳本語言更具親和力。

Javascript.NET

之前提到了它的可擴展性相當強,是因為它很簡單,無論是從源代碼來看,還是從使用上來看,都相當的簡單。自己僅需要簡單的包裝一下,即可實現大部分非常有用的功能。 官方網站的入門指引只提到了它可以執行JS代碼,沒有提到如何執行JS定義的方法,實際上在調用它的Run方法時,JS代碼已經被編譯進了上下文,如果把JS定義的方法預先編譯一次,即可在以后通過函數名稱直接調用JS方法。我恰好利用了這個特性對該類庫進行了一些簡單的包裝,實現了.NET與JS的函數互調用。不過目前官方提供的最新版本存在一個Bug,在.NET中調用JS時(通過Run方法執行JS),會隨機出現“(Unknown Location)”異常,實際是因為Stack overflow引起的,我稍微修改了一下官方的源代碼,修正了這個問題,在后面提供的源代碼中,Noesis.Javascript.dll已經是修正了該問題的編譯版本。如果需要Noesis.Javascript.dll的源代碼,請聯系我。

How to use

我僅僅對Javascript.NET進行了一個簡單的包裝,在源代碼中也提供了Example,這里就大概說明一下。

首先是配置文件,有如下幾個屬性:

◆ StartEngine:是否啟動JS引擎,如果設置為False,則不會啟動引擎,也無法調用類庫中的任何方法(會拋出異常)。

◆ RelativePath:是否為相對路徑,可以將JS文件放在應用程序根目錄,或者放在任意位置,如果在根目錄,則可以配置該屬性為True,并填寫腳本文件所在的文件夾名稱即可,具體可以參考Example。

◆ ScriptPath:腳本文件路徑,根據RelativePath填寫目錄名稱或者完整物理路徑。

◆ CreateGACMapping:是否創建全局程序集映射,該操作比較耗時,在啟動腳本引擎時,大概需要5-10秒的時間創建映射,好處是在JS方法中,可以簡單的通過命名空間+類名和程序集名稱實例化.NET對象,具體參見下面的代碼片段。

◆ CreateMappingAsyn:是否異步創建映射,設置為True以免阻塞主線程,在Mapping結束時,JS引擎會觸發事件。具體參考Example代碼。

監聽Mapping結束事件:

  1. JScriptManager.MappingComplete += (sender, e) =>  
  2.  {  
  3.      Console.Write("映射創建完成");  
  4. };  

JS的一般調用方法:

  1. function normalMethod(msg)  
  2. {  
  3.     msg="Hello,return from js:"+msg;  
  4.     return msg;  

C#代碼:

  1. string rtv = (string)JScriptManager.Call("normalMethod", msg);  
  2.           Console.WriteLine(rtv); 

傳遞.NET對象作為JS方法的參數:

  1. function callDotNet(speaker)  
  2. {  
  3.     speaker.Print("output from js");      

C#代碼:

  1. public class Speaker  
  2.  {  
  3.      public void Print(string msg)  
  4.      {  
  5.          Console.WriteLine(msg);  
  6.      }  
  7.  } 
  1. JScriptManager.Call("callDotNet"new Speaker());  

在JS中通過強命名方式實例化.NET對象(無需創建GAC映射):

  1. function testCreateByFullName()  
  2. {  
  3.     var proc=$.Create("System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",null);  
  4.     proc.StartInfo.FileName="calc";  
  5.     proc.Start();  

在JS中通過完全限定名+程序集名稱創建.NET對象(需要GAC映射):

  1. function testCreateByShortName()  
  2. {  
  3.     var proc=$.Create("System.Diagnostics.Process","System",null);  
  4.     proc.StartInfo.FileName="explorer";  
  5.     proc.StartInfo.Arguments = "about:blank";  
  6.     proc.Start();  

在JS中調用.NET靜態方法:

  1. function testStaticMethod()  
  2. {  
  3.     var arg=new Array();  
  4.     arg[0]=-25;  
  5.     var rtv = $.StaticMethod("System.Math","mscorlib","Abs",arg);  
  6.     return rtv;  

在源代碼中提供的Example分別包含了上述介紹的使用方法,最終運行的效果是在控制臺輸出兩句字符串,并啟動Windows自帶的計算器和默認的瀏覽器。

源碼下載

Javascript.NET Fix 源碼(修正了Stack overflow的問題,編譯的話,需要安裝Python 2.6.1,Python 3.X編譯會出現異常)

PS:源代碼都是VS2010的Proj

原文:http://www.cnblogs.com/sweetwxh/archive/2011/09/06/DotNet_JSEngine.html

【編輯推薦】

  1. 深入理解JavaScript作用域和作用域鏈
  2. JavaScript設計模式深入分析
  3. JavaScript原型繼承
  4. JavaScript有關的10個秘密和怪癖
  5. JavaScript入門之事件、cookie、定時等
責任編輯:陳貽新 來源: sweetwxh
相關推薦

2010-07-01 09:29:15

Java腳本語言javax.scrip

2011-08-25 09:55:27

2010-02-26 13:03:31

Python腳本語言

2011-08-23 09:44:28

LUA腳本

2011-04-22 11:07:24

groovyJava

2010-03-17 17:06:10

python腳本語言

2009-06-10 08:41:15

Linux腳本語言

2011-08-22 18:00:53

Lua語言

2011-07-06 16:54:44

ASP

2010-07-26 15:32:08

Perl腳本語言

2010-02-24 14:04:32

Python腳本語言

2017-12-18 10:30:56

微軟Python腳本

2009-07-20 16:45:41

使用StringBuiASP.NET

2020-10-13 19:04:58

Bash信號捕獲Shell腳本

2010-02-26 09:33:51

Python腳本

2012-07-16 11:23:18

LinuxWindows腳本語言

2011-08-25 10:40:21

Lua游戲

2011-08-16 10:03:45

Groovy編程語言Web

2011-08-22 16:59:28

Lua

2011-08-25 11:02:04

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久久亚洲 | 亚洲国产精品一区在线观看 | 综合网中文字幕 | 欧美日韩不卡合集视频 | 国产欧美一区二区三区在线播放 | av男人天堂影院 | 国产不卡一 | 成人免费一区二区 | 久久一区精品 | 久草免费电影 | 欧美自拍网站 | 天天影视网天天综合色在线播放 | 久久精品久久久久久 | 国产精品久久久久久中文字 | 丁香婷婷在线视频 | 免费在线播放黄色 | 国产精品久久久久久久久久久久午夜片 | 特级黄一级播放 | 日本成人片在线观看 | 亚洲成人日韩 | 91麻豆精品国产91久久久久久久久 | 日韩高清国产一区在线 | 国产亚洲欧美在线视频 | 在线免费黄色小视频 | www.婷婷亚洲基地 | 久久精品99国产精品 | 久久久久久久久毛片 | 亚洲国产69| 美女亚洲一区 | 天堂一区二区三区四区 | 亚洲精品视频在线看 | 曰批视频在线观看 | 日韩中文字幕区 | 久久国产精品一区二区三区 | 亚洲视频免费在线观看 | 午夜精品久久久久久久久久久久久 | 国产高清视频 | 亚洲国产精品99久久久久久久久 | 天天爽夜夜爽精品视频婷婷 | 国产高清在线精品一区二区三区 | 亚洲国产一区在线 |