日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

用JScript.net写.net应用程序(转)

發(fā)布時(shí)間:2025/3/19 javascript 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用JScript.net写.net应用程序(转) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

javascript是一門很神奇的語(yǔ)言,靈活,容易學(xué)習(xí),而且概念很超前。但是現(xiàn)在似乎被釘死在了瀏覽器上,其實(shí)這個(gè)才是javascript被人最大的誤解。M$的.net平臺(tái)提供了全功能的JScript支持,不過(guò)這個(gè)JScript還是符合ECMA標(biāo)準(zhǔn)的,跟M$對(duì)待其他國(guó)際標(biāo)準(zhǔn)的態(tài)度一樣,JScript添加了很多其他能力,好讓人不小心就綁死在了windows上。不過(guò)沒(méi)關(guān)系,我們這次的主題是寫一個(gè).net程序,綁死了也無(wú)所謂。誰(shuí)讓我是“向M$投降派”呢,其實(shí)我根本上是不跟錢過(guò)不去(我們幫主叫做“上官金紅”-----熟悉嗎?)

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

有了環(huán)境之后,我們可以開始編寫一些測(cè)試代碼了。首先創(chuàng)建一個(gè)test.js吧,標(biāo)準(zhǔn)的javascript代碼:

var arr = ["a","b"];
var obj = {name:"test", value:3.0};

print(arr[0]);
print(arr[1]);
print(obj.name);
print(obj.value);

執(zhí)行以下剛才的菜單命令,編譯成功。在當(dāng)前目錄下出現(xiàn)了一個(gè)test.exe,運(yùn)行,正常!

如果要編一個(gè)完整的程序,恐怕一個(gè)文件就不夠了,所以我們測(cè)試一下多個(gè)文件的編譯,創(chuàng)建一個(gè)mod.js文件,內(nèi)容如下:

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

不過(guò)編譯可是有學(xué)問(wèn)了,我們要用手工編譯了,進(jìn)入cmd,輸入jsc? /fast- mod.js test.js編譯出一個(gè)mod.exe文件來(lái),運(yùn)行,通過(guò)!但是如果我們用命令jsc /fast- test.js mod.js編譯,出來(lái)的test.exe就無(wú)法運(yùn)行,究其原因是找不到mod.js中的東西。這是一個(gè)要注意的地方。

因?yàn)镴Script做了很多擴(kuò)展,我們要測(cè)試一下擴(kuò)展命令和非擴(kuò)展之間是否可以互相協(xié)作,因?yàn)槲覀円?net下的程序,免不了要和.net SDK打交道,用擴(kuò)展當(dāng)然必要了。于是創(chuàng)建新文件pkg.js,內(nèi)容如下:

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,運(yùn)行結(jié)果如下:

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。保留所有權(quán)利。

D:\work\testjs.net>mod
a
b
test
3
haha
call haha
Eiffel Tower
hello from writeline

D:\work\testjs.net>

接下來(lái),我們還要做一個(gè)工作。因?yàn)閺膶?shí)際的javascript編程中,我們有幾個(gè)不方便的地方,一個(gè)是編輯,eclipse下游JsEclipse,但是.net下沒(méi)有,好在vs2008出來(lái)了,問(wèn)題不大了;第二就是調(diào)試,出奇的困難,firefox下有插件,很好。ie下也有,但是不太好用,經(jīng)常抓不住斷點(diǎn),但是從vs2005開始也湊胡了,只是大了一點(diǎn)而已。第三個(gè)就是js語(yǔ)言本身的問(wèn)題了,好在有現(xiàn)成的擴(kuò)展庫(kù)prototype,其他的幾個(gè)庫(kù)dojo,ext,jquery也都用過(guò),只有prototype是純面向js語(yǔ)言本身的擴(kuò)展,其他幾個(gè)跟瀏覽器綁定太緊密,用不了。所以我們接下來(lái)就要編譯prototype 1.5作為我們的擴(kuò)展庫(kù)了。

首先從這里獲取prototype1.5的代碼,用ultraedit裝入,然后運(yùn)行開頭設(shè)置的“JScript.net編譯”命令,出現(xiàn)一堆錯(cuò)誤。不要緊,我們做如下的兩個(gè)工作即可:

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

生成compitable.js文件,內(nèi)容如下:

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編譯,會(huì)有一堆警告和6個(gè)錯(cuò)誤,都是在prototype中的類似function() { this.respondToReadyState(1) }.bind(this)的錯(cuò)誤,把他們修改成fn(function() { this.respondToReadyState(1) }).bind(this)。估計(jì)原因可能是JScript編譯器的一個(gè)bug,沒(méi)能在這個(gè)環(huán)境下識(shí)別出function其實(shí)就是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;即可。

接下來(lái)我們修改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());

重新編譯,運(yùn)行即可。

有一點(diǎn)小經(jīng)驗(yàn)bigtall要給大家分享:如果程序運(yùn)行有異常,一般都是值為null引起的,JScript的異常報(bào)告不明確。

另外,prototype中dom相關(guān)的部分,ajax部分的代碼都不能使用,setTimeout,alert等函數(shù)也不能用,除非你擴(kuò)展我的compitable.js。

基本的JScript.net幫助參考這里,同樣內(nèi)容在VS2005的msdn幫助里邊也有。

實(shí)際上,要真正用JScript.net來(lái)做桌面應(yīng)用,還需要對(duì).net做一個(gè)接口層才行,不過(guò)bigtall個(gè)人認(rèn)為如果按照winform的接口規(guī)范來(lái)走,JScript就失去了優(yōu)勢(shì),以js這么靈活,應(yīng)該有一個(gè)全新的接口庫(kù)。大家可以參考一下Ruby的GUI,Python的GUI庫(kù)的做法,有興趣的可以看這個(gè)文章。

結(jié)論

通過(guò)使用參數(shù)/fast-,并且替換少許保留字之后,JScript可以編譯大部分的傳統(tǒng)js代碼,并且可以和JScript.net的擴(kuò)展語(yǔ)法同事使用。這就給我們用JScript來(lái)編制實(shí)際的應(yīng)用程序建立了基礎(chǔ)。

結(jié)合目前js領(lǐng)域的語(yǔ)言擴(kuò)展庫(kù)(目前只用了prototype),可以給JScript.net編程提供極大的方便性。但是目前JScript.net尚欠缺一個(gè)真正適合js特性的GUI庫(kù),XML庫(kù)。

附:

用 JScript.NET 還要編譯,而且面向?qū)ο蟮闹С诛@然不如 C#, 個(gè)人感覺(jué)很尷尬;?
如果要為了開發(fā)的方便性,還不如用 IronPython.

相比JScript.NET, 更期待 javascript 2 的應(yīng)用。?
腳本語(yǔ)言就該發(fā)揮腳本的優(yōu)勢(shì),而當(dāng)前要發(fā)揮這個(gè)優(yōu)勢(shì)只能通過(guò) script control 實(shí)現(xiàn)與之 interop。?
至于GUI方面,我想如果要快,可以考慮 Silverlight,畢竟這個(gè)能可視化編輯。如果是追求文法優(yōu)雅,那就采用 json,但這還得在弄個(gè)庫(kù)來(lái)實(shí)現(xiàn)。?

如果弄出 live plus! 的那位老兄愿意把源碼供出來(lái),大家把它擴(kuò)展成一個(gè)通用組件,那就最好不過(guò)了。


本文轉(zhuǎn)自鋼鋼博客園博客,原文鏈接:http://www.cnblogs.com/xugang/archive/2007/11/18/963292.html,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者

總結(jié)

以上是生活随笔為你收集整理的用JScript.net写.net应用程序(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。