【问题标题】:JavaScript interoperability with Managed/Native codeJavaScript 与托管/本机代码的互操作性
【发布时间】:2012-10-13 18:13:36
【问题描述】:

我目前正在构建一个运行无浏览器的 JavaScript 和 TypeScript 程序的服务器端应用程序。我目前使用的 JavaScript 引擎是 Microsoft 的 JavaScript 引擎“Chakra”(不过考虑使用 JavaScript.NET,因为它以更优雅的方式与 Google 的 V8 引擎挂钩)。

我正在使用 C# 和 .NET 4.0 对我的应用程序进行编程(今后将移至 4.5)

到目前为止,我遇到了几个问题,例如,如果我运行以下命令:

alert("Hello World");

我收到一个错误,因为“警报”未定义。想必这是在浏览器中实现的! (与其他对象如 HTMLElement、XMLHttpRequest 等一样)

我想知道的是,我能否编写 JavaScript 代码来编组来自 .NET(或其他托管/本机系统)的代码

例如:

function alert(message) {
    //Performs call to .NET
    MessageBox.Show("Hello World");
}

注意事项:

我已经在这里做了一些研究:

Embedding JavaScript engine into .NET

Referencing Google's V8 engine from a .NET app

Javascript engine with good interoperability with JVM and CLR

【问题讨论】:

标签: javascript .net interop v8 typescript


【解决方案1】:

有很多方法可以解决这个问题。 Chakra 是 Windows 中的“active script engine”,并实现了许多 COM 接口,使其能够告诉操作系统它能够在交互式环境中运行脚本文件。

其中一件事是在您的应用程序中使用 COM(如果您是纯托管的,则为互操作)并向脚本环境提供本机对象。这就是 windows 脚本宿主的运行方式,并在您使用 WSH 类运行脚本时将其启用到它所托管的所有脚本引擎。 COM interface references are on MSDN。您可以使用IActiveScript::AddNamedItem 在运行时将对象公开给正在执行的脚本。

我这样做是为了使托管的 IE Web 浏览器控件能够通过 javascript 调用本机代码,但是您必须对 COM 的工作非常熟悉,并且您的 COM/互操作技能必须非常敏锐。事后看来,这项艰巨的任务并不值得,因为我的一位同事发现了一种更简单的方法来完成脚本/主机 RPC(通过观察浏览器 ccontrol 的导航事件,他能够制作自定义链接,然后以编程方式单击它们然后使用链接中的 URL 来确定要执行的操作,这是一个非常黑客,但他在 5 分钟内启动并运行了它,我花了几个小时将类暴露给脚本运行时......)

【讨论】:

  • 感谢您的回答!实际上,我现在决定使用 JavaScript.NET……至少在原型设计阶段(请原谅双关语)。如有必要,我总是可以更改为其他实现。我选择 JavaScript.NET 的原因是因为它使用 Google 的 V8,并且将来可能需要将该应用程序移植到 Linux、iOS 等环境中使用。
猜你喜欢
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多