什么是IE9的JavaScript引擎(代号为“Chakra”)的ProgId或CLSID

使用.NET,我可以编写一个托pipe符合微软IActiveScript约定的脚本引擎的应用程序。 这包括来自Microsoft的JScript和VBScript,以及PerlScript,RubyScript, 我不知道还有哪些来自第三方 。

在代码中这样做的方式是这样的:

Type engine = Type.GetTypeFromProgID(progId, true); _engine = Activator.CreateInstance(engine) as IActiveScript; 

progId可以使用Javascript,JScript,ECMAScript,VBScript等等。 运行cscript.exe时可以做类似的事情,用//E选项在命令行上指定progId。 例如,这个命令:

 cscript.exe <file> //e:JScript 

..将通过JScript引擎运行指定的文件,无论其扩展名如何。

在我的机器上,如果我查看HKLM\SW\Classes\ ,那么三个{Javascript,JScript,ECMAScript}都指向相同的CLSID,我猜是JScript 5.8脚本引擎: {f414c260-6ac0-11cf-b6d1-00aa00bbbb58}

有一个ProgId或CLSID我可以指定运行IE9的JavaScript引擎,又名“查克拉”?

IE9的引擎是否仍然被IActiveScript加载?
微软的文档build议它 ,但不指定ProgId或CLSID。

安装了IE9的Chakra Javascript引擎的CLSID是
{16d51579-a30b-4c8b-a276-0ff4dc41e755}

InProcServer32是%windir%\System32\jscript9.dll

没有我能find的ProgId。 这有点奇怪, 通常成对的ProgId和CLSID条目是相互引用的。 对于给定的COM对象,registry中的ProgId项具有一个名为CLSID的子项,而CLSIDregistry项具有一个名为ProgId的子项,并且它们是相互引用的。 但IE9 CLSID的ProgId子项是“JScript”,这当然是指v5.8 Jscript CLSID。 不知道这是微软的一个错误,还是有点混淆,因为他们不希望任何人在IE9之外使用Chakra引擎。 看起来有目的的给我。


我通过searchjscript9.dll的registry了解到了CLSID。


如果您的.NET代码托pipe脚本引擎,则可以直接使用CLSID实例化IE9 JavaScript引擎(“Chakra”)的IActiveScript对象。 代码需要是这样的:

 private const string clsIdPattern = @"^(?<curly>\{)?[a-zA-Z0-9]{8}(?:-[a-zA-Z0-9]{4}){3}-[a-zA-Z0-9]{12}(?(curly)\})$"; public ScriptEngine(string language) { if (language == null) throw new ArgumentNullException("language"); Type engineType = null; if (Regex.IsMatch(language, clsIdPattern)) { // it's a CLSID var guid = new System.Guid(language); engineType = Type.GetTypeFromCLSID(guid, true); } else { // assume vanilla progId engineType = Type.GetTypeFromProgID(language, true); } var engine = Activator.CreateInstance(engineType) as IActiveScript; 

在上面的clsIdPattern中, clsIdPattern是一个正则expression式,它与熟悉的GUID格式相匹配,无论是否包含curlies。

考虑到上面的代码,你可以通过“jscript”,“Javascript”或“ECMAScript”并获得v5.8 JScript引擎。 或者您可以通过“{16d51579-a30b-4c8b-a276-0ff4dc41e755}”并获得IE9 Javascript引擎。 显然你需要安装IE9才能正常工作。

我只是试过这个,它适用于简单的情况。 我会再玩一些,真的很快。


如果你想从WSH运行Chakra,比如从cscript.exe,那么你需要一个ProgId,我想。
如果我在registry中创build“Chakra”作为Progid,引用正确的CLSID,我可以通过IE9的引擎来运行JS文件,如下所示:

 cscript.exe module.js //E:Chakra 

例如,在插入新的“Chakra”ProgId之后,给定如下的脚本:

 WScript.Echo( ScriptEngineMajorVersion() + "." + ScriptEngineMinorVersion() + "." + ScriptEngineBuildVersion()); 

…输出是这样的:

 C:\dev\js>Version.js 5.8.16982 C:\dev\js>cscript.exe Version.js //E:Chakra 9.0.16434 

这里是Javascript的AESencryptiontesting的结果,比较Chakra和JScript 5.8:

 C:\dev\js\SlowAES>cscript.exe test.aes.js AES encryption in Javascript. password : Albatros1 salt : saltines (73616c74696e6573) iterations: 1000 key : 172,52,20,51,98,71,49,195,14,31,141,51,129,8,94,66 iv : 212,27,28,156,83,245,0,35,176,157,45,141,209,143,158,248 plaintext : Hello, /r/javascript. ciphertext: fdebac9f1ed1a13bac58f3cc6558e8b0367a94245dbbfe53cacc4979799fc182 decrypted : Hello, /r/javascript. elapsed : 5011ms C:\dev\js\SlowAES>cscript.exe test.aes.js //E:Chakra AES encryption in Javascript. password : Albatros1 salt : saltines (73616c74696e6573) iterations: 1000 key : 172,52,20,51,98,71,49,195,14,31,141,51,129,8,94,66 iv : 212,27,28,156,83,245,0,35,176,157,45,141,209,143,158,248 plaintext : Hello, /r/javascript. ciphertext: fdebac9f1ed1a13bac58f3cc6558e8b0367a94245dbbfe53cacc4979799fc182 decrypted : Hello, /r/javascript. elapsed : 2593ms 

为了在我的registry中设置ProgId,我使用了这个:

 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{16d51579-a30b-4c8b-a276-0ff4dc41e755}\ProgID] @="Chakra" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{16d51579-a30b-4c8b-a276-0ff4dc41e755}\ProgID] @="Chakra" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Chakra] @="JScript Language" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Chakra\CLSID] @="{16d51579-a30b-4c8b-a276-0ff4dc41e755}" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Chakra\OLEScript] 

并没有释放脉轮,或恢复registry,我这样做:

 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{16d51579-a30b-4c8b-a276-0ff4dc41e755}\ProgID] @="JScript" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{16d51579-a30b-4c8b-a276-0ff4dc41e755}\ProgID] @="JScript" [-HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Chakra] 

此registry脚本与x64 Windows一起使用; 如果您没有x64,那么您需要删除WOW6432Node行。

可能有点迟,但是:

您也可以通过// E参数简单地指定要使用的引擎的CLSID:

  cscript.exe <file> // E:{16d51579-a30b-4c8b-a276-0ff4dc41e755} 

编辑:根据Cheeso的回答,我发现只要添加下面的registry项就可以使用jscript9而不指定CLSID。 我在这里使用键名JScript9 ,如果你喜欢,你可以用Chakra取代它。 密钥名称是您在// E之后指定的名称:then:

 Windowsregistry编辑器版本5.00

 [HKEY_LOCAL_MACHINE \ SOFTWARE \类\ JScript9]
 @ =“JScript9语言”

 [HKEY_LOCAL_MACHINE \ SOFTWARE \类\ JScript9 \ CLSID]
 @ = “{16d51579-a30b-4c8b-a276-0ff4dc41e755}”

 [HKEY_LOCAL_MACHINE \ SOFTWARE \类\ JScript9 \ OLEScript]

接着:

  cscript.exe <file> // E:JScript9 

您现在可以直接通过已发布的api调用Chakra运行时,并且不必再使用IActiveScript。

以下是MSDN上的一篇文章,展示了如何在C ++或C#中托pipeChakra运行时:

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