JavaScript与Managed / Native代码的互操作性

时间:2012-10-23 18:23:32

标签: javascript .net interop v8 typescript

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

我使用C#和.NET 4.0编写应用程序(向前移动到4.5)

到目前为止,我遇到了一些问题,例如,如果我运行以下内容:

alert("Hello World");

我收到错误,因为“alert”未定义。据推测这是在浏览器中实现的! (与HTMLElement,XMLHttpRequest等其他对象一样)

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

例如:

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

1 个答案:

答案 0 :(得分:0)

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

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

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