ie9的Javascript引擎(代号Chakra")的ProgId或CLSID是什么?

What is the ProgId or CLSID for IE9's Javascript engine (code-named "Chakra")

本文关键字:ProgId 是什么 CLSID 引擎 Javascript 代号 ie9 Chakra quot      更新时间:2023-09-26

使用。net,我可以编写一个承载脚本引擎的应用程序,它符合微软的IActiveScript约定。这包括微软的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',三个progid {Javascript, JScript, ECMAScript}都指向相同的CLSID,我猜是JScript 5.8脚本引擎:{f414c260-6ac0-11cf-b6d1-00aa00bbbb58}

是否有一个ProgId或CLSID我可以指定运行IE9的Javascript引擎,又名"Chakra"?

IE9的引擎仍然被IActiveScript加载吗?
微软的文档建议这样做,但没有指定ProgId或CLSID。

与IE9一起安装的Chakra Javascript引擎的CLSID为
{16d51579-a30b-4c8b-a276-0ff4dc41e755}

InProcServer32 is %windir%'System32'jscript9.dll .

我找不到ProgId。这有点奇怪;通常成对的ProgId和CLSID条目相互引用。对于给定的COM对象,注册表中的ProgId键有一个名为CLSID的子键,CLSID注册表键有一个名为ProgId的子键,它们相互引用。但是IE9 CLSID的ProgId子键是"JScript",这当然是指v5.8的JScript CLSID。不确定这是微软的一个错误,还是故意混淆,因为他们不希望任何人在IE9之外使用Chakra引擎。在我看来是有目的的。


我通过在注册表中搜索jscript9.dll了解了CLSID。


如果你有。net代码承载脚本引擎,你可以通过直接使用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是一个正则表达式,它匹配熟悉的GUID格式,可以带或不带周围的花括号。

根据上面的代码,您可以传递"jscript"、"Javascript"或"ECMAScript"并获得v5.8 jscript引擎。或者您可以传递"{16d51579-a30b-4c8b-a276-0ff4dc41e755}"并获得IE9 Javascript引擎。显然,您需要安装IE9才能使其工作。

我刚刚尝试了这个,它适用于简单的情况。我很快就会更多地使用它。


如果你想从WSH运行Chakra,比如从cscript.exe,那么你将需要一个ProgId,我认为。
如果我在注册表中创建"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中AES加密的测试结果,比较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

在我的注册表中设置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]

和取消Chakra暴露,或恢复注册表,我这样做:

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]

这个注册表脚本适用于x64 Windows;如果没有x64,则需要删除WOW6432Node行。

可能有点晚了,但是:

你也可以通过//E参数指定你想要使用的引擎的CLSID:

<>以前cscript.exe & lt; file>//E: {16 d51579-a30b-4c8b-a276-0ff4dc41e755} 之前

Edit:根据Cheeso的回答,我发现添加以下注册表项足以在不指定CLSID的情况下使用jscript9。我在这里使用密钥名称JScript9,如果您喜欢,您可以将其替换为Chakra。键名是在//E: then:

之后指定的。<>之前Windows注册表编辑器版本5.00(HKEY_LOCAL_MACHINE ' SOFTWARE ' ' JScript9类)@ = " JScript9语言"[HKEY_LOCAL_MACHINE ' SOFTWARE ']类' JScript9 ' CLSID@ = " {16 d51579-a30b-4c8b-a276-0ff4dc41e755} "[HKEY_LOCAL_MACHINE ' SOFTWARE ' ' JScript9 ' OLEScript类)之前

然后:

<>以前cscript.exe & lt; file>//E: JScript9

你现在可以直接通过发布的API调用Chakra运行时,你不必再使用IActiveScript了。

这是MSDN上的一篇文章,展示了如何在c++或c#中托管Chakra运行时:

https://web.archive.org/web/20151103122111/https://code.msdn.microsoft.com/windowsdesktop/JavaScript-Runtime-Hosting-d3a13880

(注:截至2019年,代码示例在github.com/microsoft/Chakra-Samples上)