什么是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