日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
在.NET中使用Javascript作為腳本語(yǔ)言

之前寫(xiě)過(guò)一篇文章,是關(guān)于在.NET中,使用v8sharp作為v8Engine的Wraper, 從而在.NET中與Javascript互操作。不過(guò)v8Sharp有幾個(gè)很大的問(wèn)題,第一,在參數(shù)中傳遞中文字符串會(huì)產(chǎn)生亂碼。第二,無(wú)法在.NET中,使用.NET對(duì)象作為參數(shù)傳遞給Javascript。這樣的話(huà),v8Sharp的實(shí)用價(jià)值就降低了不少。好在v8Engine相當(dāng)出色,有眾多的.NET開(kāi)源Wrapper,于是,找到了這款Javascript.NET,可擴(kuò)展性相當(dāng)強(qiáng)的Wrapper。

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),濱州企業(yè)網(wǎng)站建設(shè),濱州品牌網(wǎng)站建設(shè),網(wǎng)站定制,濱州網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,濱州網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

v8Engine

v8Engine是Google Chrome使用的JS解釋引擎, 其執(zhí)行效率相當(dāng)?shù)母?,根?jù)我自己的測(cè)試,是高于IE8,F(xiàn)F3等瀏覽器所使用的JS引擎。目前的最新版本與IE9,F(xiàn)F4的執(zhí)行效率不相上下。而且Javascript本身是C Style的編程語(yǔ)言,對(duì)于我們這種長(zhǎng)期使用C、C++和C#的開(kāi)發(fā)人員來(lái)說(shuō),比LUA等腳本語(yǔ)言更具親和力。

Javascript.NET

之前提到了它的可擴(kuò)展性相當(dāng)強(qiáng),是因?yàn)樗芎?jiǎn)單,無(wú)論是從源代碼來(lái)看,還是從使用上來(lái)看,都相當(dāng)?shù)暮?jiǎn)單。自己僅需要簡(jiǎn)單的包裝一下,即可實(shí)現(xiàn)大部分非常有用的功能。 官方網(wǎng)站的入門(mén)指引只提到了它可以執(zhí)行JS代碼,沒(méi)有提到如何執(zhí)行JS定義的方法,實(shí)際上在調(diào)用它的Run方法時(shí),JS代碼已經(jīng)被編譯進(jìn)了上下文,如果把JS定義的方法預(yù)先編譯一次,即可在以后通過(guò)函數(shù)名稱(chēng)直接調(diào)用JS方法。我恰好利用了這個(gè)特性對(duì)該類(lèi)庫(kù)進(jìn)行了一些簡(jiǎn)單的包裝,實(shí)現(xiàn)了.NET與JS的函數(shù)互調(diào)用。不過(guò)目前官方提供的最新版本存在一個(gè)Bug,在.NET中調(diào)用JS時(shí)(通過(guò)Run方法執(zhí)行JS),會(huì)隨機(jī)出現(xiàn)“(Unknown Location)”異常,實(shí)際是因?yàn)镾tack overflow引起的,我稍微修改了一下官方的源代碼,修正了這個(gè)問(wèn)題,在后面提供的源代碼中,Noesis.Javascript.dll已經(jīng)是修正了該問(wèn)題的編譯版本。如果需要Noesis.Javascript.dll的源代碼,請(qǐng)聯(lián)系我。

How to use

我僅僅對(duì)Javascript.NET進(jìn)行了一個(gè)簡(jiǎn)單的包裝,在源代碼中也提供了Example,這里就大概說(shuō)明一下。

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

◆ StartEngine:是否啟動(dòng)JS引擎,如果設(shè)置為False,則不會(huì)啟動(dòng)引擎,也無(wú)法調(diào)用類(lèi)庫(kù)中的任何方法(會(huì)拋出異常)。

◆ RelativePath:是否為相對(duì)路徑,可以將JS文件放在應(yīng)用程序根目錄,或者放在任意位置,如果在根目錄,則可以配置該屬性為T(mén)rue,并填寫(xiě)腳本文件所在的文件夾名稱(chēng)即可,具體可以參考Example。

◆ ScriptPath:腳本文件路徑,根據(jù)RelativePath填寫(xiě)目錄名稱(chēng)或者完整物理路徑。

◆ CreateGACMapping:是否創(chuàng)建全局程序集映射,該操作比較耗時(shí),在啟動(dòng)腳本引擎時(shí),大概需要5-10秒的時(shí)間創(chuàng)建映射,好處是在JS方法中,可以簡(jiǎn)單的通過(guò)命名空間+類(lèi)名和程序集名稱(chēng)實(shí)例化.NET對(duì)象,具體參見(jiàn)下面的代碼片段。

◆ CreateMappingAsyn:是否異步創(chuàng)建映射,設(shè)置為T(mén)rue以免阻塞主線(xiàn)程,在Mapping結(jié)束時(shí),JS引擎會(huì)觸發(fā)事件。具體參考Example代碼。

監(jiān)聽(tīng)Mapping結(jié)束事件:

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

JS的一般調(diào)用方法:

 
 
 
  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對(duì)象作為JS方法的參數(shù):

 
 
 
  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中通過(guò)強(qiáng)命名方式實(shí)例化.NET對(duì)象(無(wú)需創(chuàng)建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中通過(guò)完全限定名+程序集名稱(chēng)創(chuàng)建.NET對(duì)象(需要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中調(diào)用.NET靜態(tài)方法:

 
 
 
  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分別包含了上述介紹的使用方法,最終運(yùn)行的效果是在控制臺(tái)輸出兩句字符串,并啟動(dòng)Windows自帶的計(jì)算器和默認(rèn)的瀏覽器。

源碼下載

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

PS:源代碼都是VS2010的Proj

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


文章名稱(chēng):在.NET中使用Javascript作為腳本語(yǔ)言
文章位置:http://m.5511xx.com/article/cciogje.html