Что такое ProgId или CLSID для движка Javascript в IE9 (с кодовым названием «Чакра») - PullRequest
23 голосов
/ 24 августа 2011

Используя .NET, я могу написать приложение, в котором размещен механизм сценариев, соответствующий соглашениям Microsoft IActiveScript.Это включает в себя JScript и VBScript от Microsoft, а также PerlScript, RubyScript и Я не знаю, что еще от сторонних .

Способ сделать это в коде примерно такой:

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

, где progId может принимать значение Javascript, JScript, ECMAScript, VBScript и другие.Вы можете сделать нечто подобное при запуске cscript.exe, указав progId в командной строке с параметром //E.Например, эта команда:

cscript.exe  <file>  //e:JScript

.. запустит указанный файл независимо от его расширения через механизм JScript.

На моем компьютере, если я посмотрю в HKLM\SW\Classes\, все три progIds {Javascript, JScript, ECMAScript} указывают на один и тот же CLSID, который, как мне кажется, является механизмом сценариев JScript 5.8: {f414c260-6ac0-11cf-b6d1-00aa00bbbb58}

Есть ли ProgId или CLSID, которые я могу указать для запуска движка Javascript в IE9, он же "Чакра"?

Двигатель IE9 все еще загружается с помощью IActiveScript?
Документация Microsoft предполагает, что он делает , но не указывает ProgId или CLSID.

Ответы [ 3 ]

32 голосов
/ 24 августа 2011

CLSID для движка Chakra Javascript, установленного с IE9:
{16d51579-a30b-4c8b-a276-0ff4dc41e755}.

InProcServer32: %windir%\System32\jscript9.dll.

Нет ProgId, который я мог бы найти.Это немного странно;обычно парные записи ProgId и CLSID относятся друг к другу.Для данного COM-объекта ключ ProgId в реестре имеет подраздел CLSID, а раздел реестра CLSID имеет подраздел ProgId, и они ссылаются друг на друга.Но подраздел ProgId для CLSID IE9 - это «JScript», что, конечно, относится к CLSID Jscript v5.8.Не уверен, что это было ошибкой Microsoft или целенаправленной путаницей, потому что они не хотят, чтобы кто-либо использовал движок Chakra за пределами IE9.Выглядит целеустремленно для меня.


Я узнал о CLSID, просто выполнив поиск в реестре для jscript9.dll.


Если у вас есть .NET-код, на котором размещены скриптовые движки, вы можете создать экземпляр объекта IActiveScript для движка javascript IE9 («Чакра»), напрямую используя CLSID.Код должен выглядеть примерно так:

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» и получить движок JScript v5.8.Или вы можете передать «{16d51579-a30b-4c8b-a276-0ff4dc41e755}» и получить движок IE9 Javascript.Очевидно, что для этого нужно установить IE9.

Я только что попробовал это, и это работает для простых случаев.Я буду играть с этим еще немного, очень скоро.


Если вы хотите запустить Chakra из WSH, например из cscript.exe, то вам понадобится ProgId, я думаю.
Если я создаю «Chakra» в качестве Progid в реестре,ссылаясь на правильный CLSID, я могу запускать JS-файлы через движок IE9 следующим образом:

cscript.exe  module.js  //E:Chakra 

Например, после вставки нового ProgId "Chakra", с помощью такого скрипта:

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

А вот результат теста AES-шифрования в Javascript, сравнивающего чакру с 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]

и, чтобы открыть Чакру или вернуть реестр, я сделал это:

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]

Этот скрипт реестра работалс Windows x64;если у вас нет x64, то вам нужно удалить строки WOW6432Node.

7 голосов
/ 02 июля 2013

Может быть немного поздно, но:

Вы также можете просто указать CLSID движка, который вы хотите использовать, через аргумент // E:

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

Редактировать: Согласно ответу Cheeso, я обнаружил, что достаточно добавить следующие записи реестра, чтобы иметь возможность использовать jscript9 без указания CLSID. Я использую здесь имя ключа JScript9 , вы можете заменить его на Чакра , если хотите. Имя ключа - это то, что вы указываете после // E: then:

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
2 голосов
/ 16 января 2014

Теперь вы можете вызывать среду выполнения Chakra напрямую через опубликованные API, и вам больше не нужно использовать IActiveScript.

Вот статья на MSDN, показывающая, как разместить среду выполнения Chakra в C ++ или C #:

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

...