【问题标题】:Will the IE10 Chakra JScript engine available as stand alone accessible from C#?IE10 Chakra JScript 引擎是否可以通过 C# 单独访问?
【发布时间】:2011-08-21 19:01:58
【问题描述】:

微软可能(实际上我认为它会)在未来将 IE10 Chakra(JScript 引擎)作为独立模块发布,就像谷歌 V8 JavaScript 引擎一样。

  • 问题是:引擎会像 IronPython 一样从 C# 访问吗?

【问题讨论】:

  • 可能尚未确认?如果是这样,那么你的问题是无法回答的。
  • 同意。这太主观了,太理论化了。投票结束。

标签: c# javascript chakra


【解决方案1】:

用于 Javascript 的 Chakra 引擎可通过 IActiveScript 接口用于 C# 程序。这与 IronPython 模型不同 - 通过 Chakra 以这种方式调用的 JS 未编译为 MSIL,不是 .NET 逻辑。它不在 CLR/DLR 上运行。它在自己的引擎中运行。

// Initialize Chakra (requires IE9 to be installed)
var guid = new System.Guid("{16d51579-a30b-4c8b-a276-0ff4dc41e755}");
Type t = Type.GetTypeFromCLSID(guid, true);
// you must have a p/invoke defn for IActiveScript
var engine = Activator.CreateInstance(t) as IActiveScript;

var site = new ScriptSite(); // this is a custom class
engine.SetScriptSite(site);

var parse32 = engine as IActiveScriptParse32;
parse32.InitNew();

// parse a script
engine.SetScriptState(ScriptState.Connected);
parse32.ParseScriptText(scriptText, null, null, null, IntPtr.Zero, 0, flags, out result, out exceptionInfo);

IntPtr comObject;
engine.GetScriptDispatch(null, out comObject);

// iDispatch is a COM IDispatch  that you can use to invoke script functions. 
var iDispatch = Marshal.GetObjectForIUnknown(comObject);

iDispatch.GetType().InvokeMember(methodName, BindingFlags.InvokeMethod, null, iDispatch, arguments);

这是一个用 C# 编写的 winforms 测试应用程序,它通过这个接口运行 Chakra:

您可以下载它from here。 (查找 ScriptHost.zip 文件)

更多信息:
What is the ProgId or CLSID for IE9's Javascript engine (code-named "Chakra")

【讨论】:

  • 您好,您将如何向 javascript 引擎提供本机对象? IE。如果我写 function print() { alert("Hello World");它说对象是预期的,大概是因为警报不可用。那么你将如何实现这些东西呢?
  • @series0ne:这听起来像是在网站上提出的一个很棒的新问题!
  • @hippietrail,谢谢!我实际上已经找到了一种方法,使用 Chakra 和 V8 (JavaScript.NET)。对于警报,您只需从 .NET 中引用 JavaScript 中的 MessageBox 实例,然后编写警报函数来调用 .NET 中的 MessageBox。不过,我遇到了一些问题。 JavaScript 中的 MessageBox 实例需要一些非常模糊的名称(或路径),以免被用户覆盖,尽管这也可以在浏览器中完成,所以我认为这是可以防止的。跨度>
  • @Cheeso,该代码的许可证是什么?我猜是你的? (顺便说一句,干得好)
  • 当我现在看它时,我发现我没有附加任何许可证。我将更新 zip 以包含许可证;但与此同时,您可以在简化的(“2 条款”)BSD 许可下使用它。
【解决方案2】:

C# 和 IronPython 都是 .NET 语言。它们共享相同的运行时间,因此它们可以轻松交互。没有任何迹象表明 Chakra 是基于 .NET 构建的。相反,考虑到它为了性能而将 JavaScript 编译为机器代码,我会说它不会以相同的方式集成。

他们可能会提供一个 .NET API,可以将 JS 从 .NET 语言传递到 JavaScript 引擎,但这只是我的猜测。

【讨论】:

  • 您已经可以将 JS 传递给 JavaScript 引擎并通过操作 WebBrowser 控件来取回数据。
  • 否 - WebBrowser 控件不适合执行 Javascript。如果要显示网页,请使用 WebBrowser。如果你想从 C# 运行脚本,那么你应该使用 IActiveScript。 msdn.microsoft.com/en-us/library/ky29ffxd(v=vs.94).aspx 这是 MS 定义的从 .NET 加载和运行脚本的方式。
  • 这导致了一个没有人问的大问题:如果 .NET/CLR 是微软投入所有鸡蛋的篮子,正如我记得他们曾经说过的那样,那么为什么 MS 推出不在 CLR 之上运行的 Javascript?他们现在是不是因为 Javascript 如此受欢迎以至于它可能成为自己的平台,从而给 CLR 带来激烈的竞争而对冲他们的赌注? .NET 程序员有朝一日会被抛弃吗,就像 Silverlight 等...?
【解决方案3】:

现在可以通过 pinvoke 从 C# 直接调用 Chakra 运行时。您不需要通过活动脚本。该 api 非常好而且非常快。以下是 MSDN 上的示例:

http://code.msdn.microsoft.com/windowsdesktop/JavaScript-Runtime-Hosting-d3a13880

【讨论】:

    【解决方案4】:

    JavaScript(作为 JScript)是 .Net 支持的原始语言之一。支持是在动态可用之前创建的,因此它与 IronPython 不同...如果您需要 .Net 中的 JavaScript 引擎,它可能足以满足您的需求 - http://msdn.microsoft.com/en-us/library/72bd815a(v=VS.100).aspx

    【讨论】:

      【解决方案5】:

      查看 Microsoft 刚刚发布的关于此主题的内容:

      http://blogs.windows.com/msedgedev/2015/05/18/using-chakra-for-scripting-applications-across-windows-10/#comment-841

      在博客答案中,您可以找到 Microsoft 的最新评论。答案是: “Re:Windows scripting – Windows Scripting host 支持 JavaScript,但不基于 Chakra 引擎。目前,该项目不打算更改相同的内容。”

      【讨论】:

        猜你喜欢
        • 2013-03-21
        • 2011-10-11
        • 1970-01-01
        • 2019-06-11
        • 2011-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-02
        相关资源
        最近更新 更多