引用和使用JScript.NET“仅函数”exe程序集

时间:2010-08-21 00:48:48

标签: namespaces assemblies jscript.net

1。来自JSC的编译组件

我已经使用服务器端的JScript编译器(jsc.exe)编译了旨在成为客户端JavaScript的东西,试图制作可以从单元测试项目中测试的东西,甚至可能是可以在服务器端调试。

编译后的文件仅包含函数,如下所示(仅作为示例),它可以很好地编译到BitField.exe中。请注意,源代码中没有包装类或包。

------ BEGIN FILE(BitField.js)-------

function BitField(){
    this.values = [];
}
// more functions ...

-------结束文件-------

jsc /fast-  /out:BitField.exe Bitfield.js

BitField.exe程序集中的结果。

成功!嗯,有点......


2。测试装配/接入点?

其次,我已经创建了一个测试项目(在C#中)并成功引用了BitField.exe程序集。 (项目的类型是无关紧要的,但我提供了更多的描述来描绘一幅完整的图片。)

问题似乎是:我找不到命名空间或我可以从我的C#测试项目访问BitField.exe程序集中的BitField函数的点。该组件似乎不是“正常”。

换句话说,我需要在C#

using ???WHAT???

注意:我不想使用JScript“扩展”,这意味着不会在客户端(在Web浏览器中)运行的关键字,例如classpackage等,因为我希望代码尽可能干净,以便复制和放弃粘贴回客户端脚本环境(无论如何说“干净”代码由jsc.exe编译好,而不使用这些扩展)。当我尝试将函数包装在packageclass中时,它开始产生编译错误,这是不使用它们的另一个原因 - 因为它们似乎让我改变了我的代码。

当没有明确的容器时,有关如何使用已编译的JScript程序集的函数(通过将其引用到另一个程序集中)的任何建议吗?


更新/证明

.NET Reflector视图
alt text

1 个答案:

答案 0 :(得分:2)

在玩了一段时间后,尝试jsc.exe的各种命令行开关组合,我很确定你要做的事情不会像你希望的那样工作。如果您尝试将包含函数的js文件编译到.Net库程序集中,则会出现错误:

BitField.js(1,1) : error JS1234: Only type and package definitions are allowed inside a library

但是,还有希望!这就是我要做的......

我会保持你的“干净”BitField.js文件,然后创建一个批处理文件,将其包装在JScript类中并将其写入“脏”js文件。如果您将其视为将代码编译到DLL中的一部分,那就非常干净了。将BitField.js包装成BitFieldClass.js的代码如下所示:

合并 - 进入 - class.js

var fso = new ActiveXObject("Scripting.FileSystemObject");
var ForReading = 1;
var inputFile = fso.OpenTextFile("BitField.js",ForReading, false);
var outputFile = fso.CreateTextFile("BitFieldClass.js", true);

outputFile.write("class BitFieldClass{\n");
while (!inputFile.AtEndOfStream)
{
    var textLine = inputFile.ReadLine();
    outputFile.write (textLine + "\n");
}
outputFile.write("}");
outputFile.close();

然后将包装并编译的批处理文件非常简单:

编译js.bat

cscript merge-into-class.js
jsc /t:library /out:BitFieldClass.dll bitFieldClass.js

当然,如果你想做多个文件,你必须稍微参数化一下,但希望这足以证明这个想法。