IE10的Chakra JScript引擎能否作为独立组件从C#中访问?

11

我认为微软可能会在未来发布IE10 Chakra(JScript引擎)作为一个独立的模块,就像Google V8 JavaScript引擎一样。

  • 问题是:这个引擎是否能够像IronPython一样从C#中访问?

1
如果“may”指的是尚未确认的意思,那么你的问题就无法回答。 - Šime Vidas
同意。这太主观和理论化了。投票关闭。 - Mike Hofer
5个回答

23
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:

enter image description here

你可以从这里下载它。(查找ScriptHost.zip文件)
更多信息:
IE9的Javascript引擎(代号“Chakra”)的ProgId或CLSID是什么?

2
你好,你怎样为JavaScript引擎提供本机对象呢?比如,如果我编写函数print() {alert("Hello World");},它会显示“对象预期”,这可能是因为alert不可用。那么你该如何实现这些功能呢? - Matthew Layton
@series0ne:这听起来像是一个很棒的新问题可以在网站上提出! - hippietrail
@hippietrail,谢谢!我已经想出了一种方法来做到这一点,使用Chakra和V8(JavaScript.NET)都可以。对于alert,你只需要从.NET中的JavaScript引用一个MessageBox实例,并编写调用.NET中的MessageBox的alert函数。但是我遇到了一些问题。JavaScript中的MessageBox实例需要一些非常模糊的名称(或路径),以免被用户覆盖,尽管这也可以在浏览器中完成,所以我认为这是无法防止的。 - Matthew Layton
@Cheeso,那段代码的许可证是什么?我猜它是你的?(顺便说一句,干得好) - citizenmatt
从现在的角度来看,我发现我没有为它附加任何许可证。我会更新压缩文件以包含许可证;但与此同时,您可以在简化版(“2条款”)BSD许可证下使用它。 - Cheeso
如果我没记错的话,这段代码依赖于IActiveScript的C#原始实现,可以在SO上找到,而且没有特定的许可证:https://dev59.com/_m445IYBdhLWcg3wq8Lp - Simon Mourier

2

C#和IronPython都是.NET语言。它们共享相同的运行时,因此它们可以轻松地互操作。没有任何迹象表明Chakra是建立在.NET上的;相反,考虑到它为了性能将JavaScript编译为机器代码,我认为它不会以同样的方式集成。

它们可能提供一个.NET API,使得从.NET语言传递JS到JavaScript引擎成为可能,但这只是我的猜测。


你已经可以通过操作“WebBrowser”控件将JS传递给JavaScript引擎并获取数据返回。 - Andrea
6
不,WebBrowser控件不适合执行Javascript。如果你想显示网页,可以使用WebBrowser。如果你想从C#运行脚本,应该使用IActiveScript。这是微软定义的在.NET中加载和运行脚本的方法。详情请见http://msdn.microsoft.com/en-us/library/ky29ffxd(v=vs.94).aspx。 - Cheeso
这导致了一个重要的问题,但却没有人提出来:如果.NET/CLR是微软把所有筹码都压在上面的篮子(我记得他们曾经这样说过),那么为什么微软推出的Javascript不运行在CLR之上呢?他们现在是否正在押注Javascript如此流行,以至于它可能成为自己的平台,给CLR带来严峻的竞争?.NET程序员是否有一天会被抛弃,就像Silverlight等技术一样? - Andz

2

0

JavaScript(作为JScript)是.Net支持的最初语言之一。在动态性可用之前就已经创建了支持,因此在这个意义上它与IronPython不同...如果您需要在.Net中使用JavaScript引擎,则可能已经足够满足您的需求-http://msdn.microsoft.com/en-us/library/72bd815a(v=VS.100).aspx


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接