23

使用 .NET,我可以编写一个应用程序,该应用程序托管一个符合 Microsoft 的 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\,三个 progIds {Javascript, JScript, ECMAScript} 都指向同一个 CLSID,我猜是 JScript 5.8 脚本引擎:{f414c260-6ac0-11cf-b6d1-00aa00bbbb58}

我可以指定一个 ProgId 或 CLSID 来运行 IE9 的 Javascript 引擎,也就是“Chakra”吗?

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

4

3 回答 3

33

与 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;

在上面,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 行。

于 2011-08-23T23:44:33.210 回答
7

可能有点晚了,但是:

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

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

编辑:根据 Cheeso 的回答,我发现添加以下注册表项就足以在不指定 CLSID 的情况下使用 jscript9。我在这里使用键名JScript9,如果您愿意,可以将其替换为Chakra。键名是您在 //E: 之后指定的内容,然后:

Windows 注册表编辑器版本 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\JScript9]
@="JScript9 语言"

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

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\JScript9\OLEScript]

接着:

cscript.exe <文件> //E:JScript9
于 2013-07-02T11:21:51.083 回答
2

您现在可以通过已发布的 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上)

于 2014-01-16T16:25:23.847 回答