程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 用JScript.net寫.net應用程序

用JScript.net寫.net應用程序

編輯:關於.NET

Javascript是一門很神奇的語言,靈活,容易學習,而且概念很超前。但是現在似乎被釘死在了浏覽器上,其實這個才是Javascript被人最大的誤解。MS的.net平台提供了全功能的JScript支持,不過這個JScript還是符合ECMA標准的,跟M$對待其他國際標准的態度一樣,JScript添加了很多其他能力,好讓人不小心就綁死在了Windows上。不過沒關系,我們這次的主題是寫一個.Net程序,綁死了也無所謂。誰讓我是“向MS投降派”呢,其實我根本上是不跟錢過不去。

  安裝了.net SDK就默認安裝了JScript的編譯程序jsc.exe了。在正式使用之前,我們要設置一個集成的編譯環境,bigtall用UltraEdit,所以在菜單“高級/工具配置”裡邊新建了一個命令:菜單項名稱為“JScript.net編譯”;命令行為C:\Windows\Microsoft.Net\Framework\v2.0.50727\JSc.exe /fast- "%f" ;工作目錄為 %p;還要記得把“輸出”設置為“輸出到列表框”,保存即可。

  有了環境之後,我們可以開始編寫一些測試代碼了。首先創建一個test.JS吧,標准的Javascript代碼:

  var arr = ["a","b"]; 
  var obj = {name:"test", value:3.0}; 
  print(arr[0]); 
  print(arr[1]); 
  print(obj.name); 
  print(obj.value);

  執行以下剛才的菜單命令,編譯成功。在當前目錄下出現了一個test.exe,運行,正常!

  如果要編一個完整的程序,恐怕一個文件就不夠了,所以我們測試一下多個文件的編譯,創建一個mod.JS文件,內容如下:

  function hello() 
  { 
  this.name = "haha"; 
  } 
  function haha() 
  { 
  print("call haha"); 
  }

  然後我們修改test.JS如下:

  var arr = ["a","b"]; 
  var obj = {name:"test", value:3.0}; 
  print(arr[0]); 
  print(arr[1]); 
  print(obj.name); 
  print(obj.value); 
  import mod; 
  var t = new hello(); 
  print(t.name);

  不過編譯可是有學問了,我們要用手工編譯了,進入cmd,輸入jsc /fast- mod.js test.js編譯出一個mod.exe文件來,運行,通過!但是如果我們用命令jsc /fast- test.js mod.js編譯,出來的test.exe就無法運行,究其原因是找不到mod.JS中的東西。這是一個要注意的地方。

  因為JScript做了很多擴展,我們要測試一下擴展命令和非擴展之間是否可以互相協作,因為我們要編.net下的程序,免不了要和.Net SDK打交道,用擴展當然必要了。於是創建新文件pkg.JS,內容如下:

  import System; 
  package France.Paris { 
  public class Landmark { 
  static var Tower : String = "Eiffel Tower"; 
  function p() 
  { 
  System.Console.WriteLine({t:"hello from writeline"}.t); 
  } 
  } 
  };

  然後我們把test.JS修改如下:

  var arr = ["a","b"]; 
  var obj = {name:"test", value:3.0}; 
  print(arr[0]); 
  print(arr[1]); 
  print(obj.name); 
  print(obj.value); 
  var t = new hello(); 
  print(t.name); 
  haha(); 
  print(France.Paris.Landmark.Tower); 
  import France.Paris; 
  new Landmark().p();

  使用命令行jsc /fast- mod.js pkg.js test.JS編譯出mod.exe,運行結果如下:

  D:\work\testJS.Net>jsc /fast- mod.js pkg.js test.JS 
  Microsoft (R) JScript Compiler version 8.00.50727 
  for Microsoft (R) .Net Framework version 2.0.50727 
  Copyright (C) Microsoft Corporation 1996-2005。保留所有權利。 
  D:\work\testJS.Net>mod 
  a 
  b 
  test 
  3 
  haha 
  call haha 
  Eiffel Tower 
  hello from writeline 
  D:\work\testJS.Net>

接下來,我們還要做一個工作。因為從實際的Javascript編程中,我們有幾個不方便的地方,一個是編輯,eclipse下游JSEclipse,但是.Net下沒有,好在vs2008出來了,問題不大了;第二就是調試,出奇的困難,Firefox下有插件,很好。IE下也有,但是不太好用,經常抓不住斷點,但是從vs2005開始也湊胡了,只是大了一點而已。第三個就是js語言本身的問題了,好在有現成的擴展庫prototype,其他的幾個庫dojo,ext,jquery也都用過,只有prototype是純面向JS語言本身的擴展,其他幾個跟浏覽器綁定太緊密,用不了。所以我們接下來就要編譯prototype 1.5作為我們的擴展庫了。

  首先從這裡獲取prototype1.5的代碼,用ultraedit裝入,然後運行開頭設置的“JScript.Net編譯”命令,出現一堆錯誤。不要緊,我們做如下的兩個工作即可:

  全文、全詞、大小寫敏感查找替換set為_set,get為_get, event為ev

  生成compitable.JS文件,內容如下:

  function fn(func):Function{return func;} 
  var document = { 
  getElementById: function(){ return null;}, 
  createElement: function(){return {appendChild:function(){}};}, 
  createTextNode: function(){return {};}, 
  getElementsByTagName: function(){ return []; }, 
  addEventListener:function(){}, 
  write:function(){}, 
  all: [], 
  body: {}, 
  documentElement: {} 
  }; 
  var window = { 
  scrollTo:function(){}, 
  setTimeout: function(){}, 
  attachEvent:function(){}, 
  clearInterval:function(){}, 
  setInterval:function(){}, 
  location:{href:""}, 
  pageXOffset:0, 
  pageYOffset:0 
  }; 
  var navigator = { 
  userAgent: "", 
  appVersion:"" 
  };

  使用命令行jsc /debug /fast- mod.js pkg.js compitable.js prototype.1.5.js test.js編譯,會有一堆警告和6個錯誤,都是在prototype中的類似function() { this.respondToReadyState(1) }.bind(this)的錯誤,把他們修改成fn(function() { this.respondToReadyState(1) }).bind(this)。估計原因可能是JScript編譯器的一個bug,沒能在這個環境下識別出function其實就是Function類型。

  如果使用的是最新的prototype1.6,除了上述幾步外,還要大小寫敏感替換this.Element為Element,把1555行var element = this.Element修改為var element = typeof Element == "undefined" ? {} : Element;把3845行wrapper.handler = handler;替換為fn(wrapper).handler = handler;即可。

  接下來我們修改test.JS文件,如下:

  var arr = ["a","b"]; 
  var obj = {name:"test", value:3.0}; 
  print(arr[0]); 
  print(arr[1]); 
  print(obj.name); 
  print(obj.value); 
  var t = new hello(); 
  print(t.name); 
  haha(); 
  print(France.Paris.Landmark.Tower); 
  import France.Paris; 
  new Landmark().p(); 
  var instance = { 
  funca: function(){return "funca";}, 
  funcb: function(){return "funcb";} 
  }; 
  Object.extend(instance, { 
  funcb: function(){return "override funcb";}, 
  funcExt: function() { return "funcExt";} 
  }); 
  print(instance.funca()); 
  print(instance.funcb()); 
  print(instance.funcExt());

  重新編譯,運行即可。

  有一點小經驗bigtall要給大家分享:如果程序運行有異常,一般都是值為null引起的,JScript的異常報告不明確。

  另外,prototype中dom相關的部分,AJax部分的代碼都不能使用,setTimeout,alert等函數也不能用,除非你擴展我的compitable.JS。

  基本的JScript.Net幫助參考這裡,同樣內容在VS2005的msdn幫助裡邊也有。

  實際上,要真正用JScript.net來做桌面應用,還需要對.Net做一個接口層才行,不過bigtall個人認為如果按照winform的接口規范來走,JScript就失去了優勢,以JS這麼靈活,應該有一個全新的接口庫。大家可以參考一下Ruby的GUI,Python的GUI庫的做法,有興趣的可以看這個文章。

  結論

  通過使用參數/fast-,並且替換少許保留字之後,JScript可以編譯大部分的傳統js代碼,並且可以和JScript.Net的擴展語法同事使用。這就給我們用JScript來編制實際的應用程序建立了基礎。

  結合目前js領域的語言擴展庫(目前只用了prototype),可以給JScript.net編程提供極大的方便性。但是目前JScript.Net尚欠缺一個真正適合JS特性的GUI庫,XML庫。

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved