如何用JScript.net写.net应用程序

本文介绍了如何使用JScript.net进行编程,包括设置编译环境、编写及编译多个文件、测试扩展命令等功能,并通过改造Prototype库提升编程便利性。

 

.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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值