【问题标题】:How can I get C# to interop with Javascript?如何让 C# 与 Javascript 互操作?
【发布时间】:2009-03-26 21:43:42
【问题描述】:

我想在我的 C# 程序中托管 Javascript。我希望允许用户编写自定义 Javascript 代码,让我的 C# 程序运行他们的功能,并允许用户使用我的框架代码。

可以这样做吗?如果有,怎么做?

编辑:明确地说,我在这个项目中使用 ASP.NET。

【问题讨论】:

  • 这可以来自网页,还是需要来自winform?
  • 理想情况下,无论界面如何,它都应该可以工作......

标签: c# javascript interop


【解决方案1】:

您还可以使用 webbrowser 控件将 javascript 托管在 html 文档中,以在两者之间进行交互,您将创建一个 COM 可见类并将其实例设置为 ObjectForScripting 属性。

现在可以通过 javascript 中的 window.external 访问“外部”类的任何公共成员。此外,从托管代码方面,您可以使用文档的 InvokeScript 方法来调用任何 javascript 函数。

这种方式很容易在两者之间传递复杂的对象。

我在这个 Google Earth Api 应用程序中多次使用了这个想法。 http://fraserchapman.blogspot.com/2008/08/google-earth-plug-in-and-c.html

【讨论】:

  • 啊,太好了!在我之前的谷歌搜索中,我发现有人建议使用网络浏览器控制方法,但没有提供任何解释,我认为这些建议超出了我的用例。谢谢=)
  • 如果你也检查一下这个例子,你会看到一些更复杂的交互,包括在运行时注入 javascript 的能力......请参阅源代码中的 IHTMLScriptElement.cs。 code.google.com/p/winforms-geplugin-control-library – 弗雷泽
【解决方案2】:

我强烈建议您使用Microsoft Dynamic Langauage Runtime (DLR)。它的生活目的是促进.Net 环境中的脚本编写。 DLR 不是特定于脚本的,因此随着时间的推移,将在其上构建更多脚本语言,但目前我所知道的是 IronRuby、IronPython 和 JScript。

【讨论】:

  • 我可能会走这条路,但我喜欢 JavaScript 作为一门语言。如果有 JavaScript 的 DLR 实现,那就太好了,但到目前为止,我还没有在那个领域看到任何东西。
  • 过去,Microsoft.Scripting 库的早期示例有 JScript 示例。我已经读到它不再被维护了。
  • 是的,您将使用 DLR 和动态类型 - 但您仍然必须首先将 JS 托管在浏览器控件中并创建一个 COM 可见类。完成后,DLR 使互操作变得轻而易举,因为您可以使用点语法等,而不必担心反射和调用,但是,DLR 不会为您运行 JS,它和动态类型将只是让您更轻松地使用它。
【解决方案3】:

Spidermonkey .NET 可能是您正在寻找的。

我不确定它的发展程度。但它基本上是我非常喜欢的Mozilla's Spidermonkey Javascript 解析器引擎的一个端口。

或者你可以评价一下directly

【讨论】:

    【解决方案4】:

    以前的方法是使用 Windows Script Host,它允许您托管 JSCript 或 VBScript。

    【讨论】:

      【解决方案5】:

      您当然可以从 C# 本地运行 Javascript - 请参阅 this article 了解初学者。不过,让 Javascript 访问您的框架可能会更棘手。或许Script# 能帮上忙?

      【讨论】:

      • Script# 会帮助编写 JS,但我认为这不会帮助他从 JS 调用 .NET 代码。
      【解决方案6】:

      您可以在其中嵌入 JavaScript 的 HTML 组件。对于另一种方式,正确的事情是 ASP.NET Web 服务。也许有了智能客户端,您可以将两者结合起来。

      【讨论】:

        猜你喜欢
        • 2021-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-08
        • 1970-01-01
        • 2018-03-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多