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

Joh*_*n K 6 assemblies namespaces jscript.net

1. JSC编制的汇编

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

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

------开始文件(BitField.js)-------

function BitField(){
    this.values = [];
}
// more functions ...
Run Code Online (Sandbox Code Playgroud)

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

jsc /fast-  /out:BitField.exe Bitfield.js
Run Code Online (Sandbox Code Playgroud)

结果在BitField.exe程序集中.

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


2.测试装配/接入点?

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

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

换句话说我需要在C#

using ???WHAT???
Run Code Online (Sandbox Code Playgroud)

:我不想使用JScript的"扩展",这意味着将无法运行客户端(web浏览器)的关键字,例如class,package等等,因为我想要的代码是干净的,尽可能为复制和粘贴回到客户端脚本环境(无论如何说"干净"代码由jsc.exe编译好,而不使用这些扩展).当我尝试将函数包装起来package并且class它开始产生编译错误时,这是​​不使用它们的另一个原因 - 因为它们似乎让我改变了我的代码.

关于如何在没有显式容器的情况下使用已编译的JScript程序集的功能(通过将其引用到另一个程序集中)的任何建议?


更新/证明

.NET Reflector视图
替代文字

Chr*_*nes 2

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

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

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

我会保持“干净”的 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();
Run Code Online (Sandbox Code Playgroud)

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

编译js.bat

cscript merge-into-class.js
jsc /t:library /out:BitFieldClass.dll bitFieldClass.js
Run Code Online (Sandbox Code Playgroud)

当然,如果您想要处理多个文件,则必须对一些内容进行一些参数化,但希望这足以证明这个想法。