javascript是一门很神奇的语言,灵活,容易学习,而且概念很超前。但是现在似乎被钉死在了浏览器上,其实这个才是javascript被人最大的误解。M$的.net平台提供了全功能的JScript支持,不过这个JScript还是符合ECMA标准的,跟M$对待其他国际标准的态度一样,JScript添加了很多其他能力,好让人不小心就绑死在了windows上。不过没关系,我们这次的主题是写一个.net程序,绑死了也无所谓。谁让我是“向M$投降派”呢,其实我根本上是不跟钱过不去(我们帮主叫做“上官金红”-----熟悉吗?)

安装了.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编译”命令,出现一堆错误。不要紧,我们做如下的两个工作即可:

  1. 全文、全词、大小写敏感查找替换set为_set,get为_get, event为ev
  2. 生成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:""
        };

  3. 使用命令行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库。

用JScript.net写.net应用程序相关推荐

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

    javascript是一门很神奇的语言,灵活,容易学习,而且概念很超前.但是现在似乎被钉死在了浏览器上,其实这个才是javascript被人最大的误解.M$的.net平台提供了全功能的JScript支 ...

  2. 女朋友求爱c语言程序,[转载]一个程序员写的求爱程序

    [转载]一个程序员写的求爱程序 set fso=createobject("scripting.filesystemobject") set ws=wscript.createob ...

  3. 第十、十一周项目-阅读程序,写出这些程序的运行结果(1)

    <pre name="code" class="cpp">/* *Copyright(c)2016,烟台大学计算机与控制工程学院 *All righ ...

  4. mapreduce编程实例python-使用Python语言写Hadoop MapReduce程序

    原标题:使用Python语言写Hadoop MapReduce程序 Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 在本教程中,我将描述如何使用Pytho ...

  5. python表白程序-python如何写出表白程序

    用python编表白程序的方法: 1.创建GUI窗口,实现代码的调用. 2.编写点击触发函数,实现表白程序. 具体代码如下: from tkinter import * from tkinter im ...

  6. python写出的程序如何给别人使用-python如何写出表白程序

    用python编表白程序的方法: 1.创建GUI窗口,实现代码的调用. 2.编写点击触发函数,实现表白程序. 具体代码如下:from tkinter import * from tkinter imp ...

  7. 更改开机默认不显示explorer.exe,直接启动自己写的EXE程序方法

    原文:更改开机默认不显示explorer.exe,直接启动自己写的EXE程序方法 更改开机默认不显示explorer.exe,直接启动自己写的EXE程序的函数: bool UpdateWinlogon ...

  8. 学了C语言,如何利用CURL写一个下载程序?—用nmake编译CURL并安装

    在这一系列的前一篇文章学了C语言,如何为下载狂人写一个磁盘剩余容量监控程序?中,我们为下载狂人写了一个程序来监视磁盘的剩余容量,防止下载的东西撑爆了硬盘.可是,这两天,他又抱怨他的下载程序不好用,让我 ...

  9. python画完图 程序暂停运行_[Python实战]你也能写的计时器程序

    文章地址:[Python实战]你也能写的计时器程序 上次,公众号介绍了如何使用 Pyqt5 制作猜数游戏界面,并介绍了如何在 Pycharm 中使用 Qt Designer 生成 UI 文件.这次,我 ...

最新文章

  1. 《敏捷软件开发》学习笔记 第20章
  2. html5数据提交到mysql,保存html5画布作为数据到mysql数据库
  3. 编写测试:VC下获取文件大小的4种方法
  4. lasso特征选择python_转:结合Scikit-learn介绍几种常用的特征选择方法-2
  5. matlab 三维图像配准,[转载]Matlab实现多种图像配准(转)
  6. 我们并没有觉得MapReduce速度慢,直到Spark出现
  7. jeecg <t:choose 功能标签用法修改 处理选择0条记录回写
  8. JavaScript(四)—— JavaScript 内置对象/JavaScript 简单数据类型与复杂类型
  9. 判断浏览器设置相应的CSS
  10. CDH集群禁用kerberos的讲解
  11. 《Node.js实战(双色)》作者之一——吴中骅访谈录
  12. 带存储功能的计算器是什么样的_19年中级会计考生能不能带计算器考试?今天统一回复!...
  13. 企业全面运营管理沙盘模拟心得_你要的企业沙盘模拟心得来了!!!
  14. html表格的基础知识及源代码-尚硅谷
  15. 年仅30岁!腾讯游戏程序员毛星云意外身故。。。
  16. 无路可逃java攻略_《生化危机2:重制版》幽灵生还者无路可逃流程攻略
  17. 怎样更换计算机主板电池,如何更换电脑主板电池
  18. 收藏--真正爱你的男人
  19. mumu模拟机安装证书
  20. c语言中compar的用法,compare的用法

热门文章

  1. linux mysql 知乎_在 Linux 上安装 MariaDB 或 MySQL | Linux 中国
  2. Windows版本Oracle审计日志,【情报】Oracle ORA-28056: 未能将审计记录写入 Windows 事件日志...
  3. manven需要注意点几点
  4. CSS3-transform-style
  5. java 10-4 Scanner方法
  6. 远程ubuntu虚拟机Tensorflow搭建 - 1 SSH连接
  7. Kafka的消息格式
  8. 数据结构C语言版之查找(折半选择快速等)
  9. android backlight
  10. android 六边形简书,深入理解六边形架构