当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 用JScript.net写.net应用程序

ASP.NET
使用函数传递参数来执行相应的数据库操作
如何实现在窗体和窗体之间进行传递数据
ASP.NET中文显示之两种解决方法
ASP.NET、JSP及PHP之间的抉择
ASP.NET 2.0发送电子邮件中存在的问题
谈谈HtmlControl与WebControl的区别与用途
从ASP.NET 1.1升级到ASP.NET 2.0要考虑的Cookie问题
通过系统配置来提高ASP.NET应用程序的稳定性
妙用ASP2.0中的URL映射改变网址
AJAX实现web页面中级联菜单的设计
ASP.NET跨页面传值技巧总结
再议ASP.NET DataGrid控件中的“添加新行”功能
Geometry 对象浅析
重构CollapsibleSplitter
如何利用.NET Framework使用RSS feed
ASP.NET获取IP与MAC地址的方法
在ASP.NET 2.0中使用样式、主题和皮肤
ASP.NET中为GridView添加删除提示框
ASP.NET 2.0,无刷新页面新境界
看看一个.net版对话框控件

ASP.NET 中的 用JScript.net写.net应用程序


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 80 ::
收藏到网摘: n/a

  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库。