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

Che*_*eso 23 .net javascript wsh iactivescript chakra

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

在代码中执行此操作的方法是这样的:

    Type engine = Type.GetTypeFromProgID(progId, true);
    _engine = Activator.CreateInstance(engine) as IActiveScript;
Run Code Online (Sandbox Code Playgroud)

其中progId可以采用Javascript,JScript,ECMAScript,VBScript等值.运行cscript.exe时可以执行类似的操作,在命令行中使用该//E选项指定progId .例如,这个命令:

cscript.exe  <file>  //e:JScript
Run Code Online (Sandbox Code Playgroud)

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

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

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

IE9的引擎是否仍然被IActiveScript加载?
Microsoft的文档表明它确实如此,但没有指定ProgId或CLSID.

Che*_*eso 32

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

InProcServer32是%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;
Run Code Online (Sandbox Code Playgroud)

在上面,clsIdPattern是一个匹配熟悉的GUID格式的正则表达式,有或没有周围的curlies.

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

我刚试过这个,它适用于简单的情况.我会更快地玩这个,真的很快.


如果你想从WSH运行Chakra,比如从cscript.exe运行Chakra,那么我认为你需要一个ProgId.
如果我在注册表中创建"Chakra"作为Progid,引用正确的CLSID,我可以通过IE9的引擎运行JS文件,如下所示:

cscript.exe  module.js  //E:Chakra 
Run Code Online (Sandbox Code Playgroud)

例如,在插入新的"Chakra"ProgId之后,给出如下脚本:

WScript.Echo( ScriptEngineMajorVersion() + "." +
              ScriptEngineMinorVersion() + "." +
              ScriptEngineBuildVersion());
Run Code Online (Sandbox Code Playgroud)

...输出是这样的:

C:\dev\js>Version.js
5.8.16982

C:\dev\js>cscript.exe Version.js  //E:Chakra
9.0.16434
Run Code Online (Sandbox Code Playgroud)

这是在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
Run Code Online (Sandbox Code Playgroud)

要在我的注册表中设置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]
Run Code Online (Sandbox Code Playgroud)

并取消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]
Run Code Online (Sandbox Code Playgroud)

此注册表脚本适用于x64 Windows; 如果你没有x64,那么你需要删除WOW6432Node行.

  • 另请参阅http://cheeso.members.winisp.net/srcview.aspx?dir=script&file=ScriptHost.zip,以获取使用Chakra在C#应用程序中运行Javascript的示例. (2认同)

ima*_*iro 7

可能会有点晚,但是:

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

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

编辑:根据Cheeso的回答,我发现只需添加以下注册表项就可以使用jscript9而无需指定CLSID.我在这里使用密钥名称JScript9,如果你愿意,可以用Chakra替换它.键名是在// E之后指定的:然后:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\JScript9]
@="JScript9 Language"

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

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\JScript9\OLEScript]

然后:

cscript.exe  <file>  //E:JScript9