Что такое ProgId или CLSID для движка Javascript в IE9 (с кодовым названием "Чакра")
Используя.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 ответа
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" и получить движок v5.8 JScript. Или вы можете передать "{16d51579-a30b-4c8b-a276-0ff4dc41e755}" и получить движок IE9 Javascript. Очевидно, вам нужно установить IE9, чтобы это работало.
Я только что попробовал это, и это работает для простых случаев. Я буду играть с этим еще немного, очень скоро.
Если вы хотите запустить Chakra из WSH, например из cscript.exe, то вам понадобится ProgId, я думаю.
Если я создаю "Чакру" как Progid в реестре, ссылаясь на правильный CLSID, я могу запускать файлы JS через движок IE9 следующим образом:
cscript.exe module.js //E: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
И вот результат теста AES-шифрования в Javascript, сравнивающего 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]
и чтобы разоблачить чакру или вернуть реестр, я сделал это:
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.
Может быть немного поздно, но:
Вы также можете просто указать CLSID движка, который вы хотите использовать, через аргумент // E:
cscript.exe <файл> // E: {16d51579-a30b-4c8b-a276-0ff4dc41e755}
Изменить: Согласно ответу Cheeso я обнаружил, что достаточно добавить следующие записи реестра, чтобы иметь возможность использовать jscript9 без указания CLSID. Я использую здесь имя ключа JScript9, вы можете заменить его на Chakra, если хотите. Имя ключа - это то, что вы указываете после // E: then:
Редактор реестра Windows, версия 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\JScript9] @="Язык JScript9" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ CLSID \ JScript9] @="{16d51579-a30b-4c8b-a276-0ff4dc41e755}" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\JScript9\OLEScript]
А потом:
cscript.exe <файл> // E: JScript9
Теперь вы можете вызывать среду выполнения Chakra напрямую через опубликованные API-интерфейсы, и вам больше не нужно использовать IActiveScript.
Вот статья на MSDN, показывающая, как разместить среду выполнения Chakra в C++ или C#:
http://code.msdn.microsoft.com/windowsdesktop/JavaScript-Runtime-Hosting-d3a13880