【问题标题】:Referencing and using JScript.NET "functions only" exe assembly引用和使用 JScript.NET “仅限函数” exe 程序集
【发布时间】:2010-08-21 00:48:47
【问题描述】:

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# 测试项目访问 BitField.exe 程序集中的 BitField 函数的命名空间或点。大会似乎不是“正常的”。

换句话说,我需要在 C# 中

using ???WHAT???

注意:我不想使用 JScript “扩展”,即不会在客户端(在 Web 浏览器中)运行的关键字,例如,class、@987654326 @ 等,因为我希望代码尽可能干净,以便复制并粘贴回客户端脚本环境(尽管说“干净”的代码在不使用这些扩展的情况下由 jsc.exe 编译得很好)。当我尝试将函数包装在packageclass 中时,它开始产生编译错误,所以这是不使用它们的另一个原因——因为它们似乎让我改变了我的代码。

当没有明确的容器时,我可以如何使用已编译的 JScript 程序集的功能(通过将其引用到另一个程序集)有什么建议吗?


更新/证明

.NET 反射器视图

【问题讨论】:

  • 您是否查看了使用 .NET Reflector 生成的程序集?你记得公开它的课程吗?您在哪个命名空间中声明了您的函数?
  • @EricLaw:如问题所述,源代码中没有类。 .NET Reflector 在这种情况下不提供帮助 - 无法引用它显示的内容。源代码中也没有声明命名空间。

标签: namespaces assemblies jscript.net


【解决方案1】:

在玩了一段时间之后,并尝试了 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();

然后打包并编译它的批处理文件真的很简单:

编译-js.bat

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

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

【讨论】:

  • 这是一个可行的解决方案,我喜欢它可以自动化。
  • 事实上,我希望有一个更直接的解决方案而不是解决方法,但这可能是徒劳的。因此,我决定通过 upvote 机制将赏金决定留给社区。我觉得有一个答案可以描述为什么直接解决方案会出现这个问题。但只有时间会证明一切。即使是赏金也没有引起太多的活动,所以我怀疑这是一个艰难的。与此同时,我将使用该解决方法并感谢它。
  • 这很公平。不过,根据编译器的工作方式,我认为您不会找到直接的解决方案。它似乎将一个类之外的所有代码编译成一个整体的“脚本”类,类似于 Groovy 编译脚本的方式。编写编译器的人似乎已经竭尽全力确保您不能直接访问该脚本类,所以我猜您不走运,但我希望您能找到您要找的东西!
猜你喜欢
  • 1970-01-01
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多