1. JSC汇编的汇编
我已经在服务器端使用JScript编译器(jsc.exe)编译了打算作为客户端JavaScript的内容,以尝试从单元测试项目中进行测试,甚至可以进行调试。在服务器端。
编译后的文件仅包含以下功能(仅作为示例),它可以很好地编译到BitField.exe中。注意,源代码中没有包装类或包。
------起始文件(BitField.js)-------
function BitField(){
this.values = [];
}
// more functions ...
-------结束文件-------
jsc /fast- /out:BitField.exe Bitfield.js
生成BitField.exe程序集。
成功! 好吧,有点...。
2.测试组装/接入点?
其次,我已经创建了一个测试项目(使用C#),并在BitField.exe程序集中成功引用了该项目。 (项目的类型无关紧要,但我将提供更多描述以描绘出全貌。)
问题似乎是:我无法从我的C#测试项目中找到 namespace 或可以访问BitField.exe程序集中的BitField函数的位置。该程序集似乎不是“正常”的。
换句话说,我需要在C#中
using ???WHAT???
注意:我不想使用JScript“扩展名”,意思是不会在客户端(在Web浏览器中)运行的关键字,例如
class
,package
等,因为我希望代码尽可能地干净以便复制并将其粘贴回客户端脚本环境(尽管所说的“干净”代码可以通过jsc.exe正常编译,而无需使用这些扩展名)。当我尝试将函数包装在package
和class
中时,它开始产生编译错误,所以这是不使用它们的另一个原因-因为它们似乎使我改变了我的代码。在没有显式容器的情况下,如何使用已编译的JScript程序集的功能(通过将其引用到另一个程序集)有什么建议吗?
更新/证明
.NET反射器 View
最佳答案
在玩了一段时间之后,并尝试了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中的代码如下所示:
merge-into-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();
然后打包并打包的批处理文件非常简单:
compile-js.bat
cscript merge-into-class.js
jsc /t:library /out:BitFieldClass.dll bitFieldClass.js
当然,如果您想处理多个文件,则必须对参数进行一些参数化,但是希望这足以证明这个想法。