Qu'est-ce que le programme ou CLSID pour le moteur Javascript de IE9 (nommé code " Chakra")

en utilisant .NET, je peux écrire une application qui héberge un moteur de script qui respecte les conventions IActiveScript de Microsoft. Cela inclut JScript et VBScript de Microsoft, et aussi PerlScript, RubyScript et Je ne sais pas quoi d'autre de tiers .

La façon de le faire dans le code est quelque chose comme ceci:

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

où le progId peut prendre la valeur Javascript, JScript, ECMAScript, VBScript, et pour les autres. Vous pouvez faire quelque chose de similaire en exécutant cscript.exe, spécifiant le programme sur la ligne de commande avec l'option //E . Par exemple, cette commande:

cscript.exe  <file>  //e:JScript

..exécutera le fichier spécifié, quelle que soit son extension, à travers le moteur JScript.

sur ma machine, si je regarde dans HKLMSWClasses , les trois progides {Javascript, JScript, ECMAScript} pointent tous vers le même CLSID, qui je suppose est le script JScript 5.8 moteur: {f414c260-6ac0-11cf-b6d1-00aa00bbbb58}

y a-t-il un ProgId ou CLSID que je puisse spécifier pour faire fonctionner le moteur Javascript D'IE9, alias "Chakra"?

le moteur D'IE9 est-il toujours chargé par IActiveScript?

la documentation de Microsoft suggère qu'il fait , mais ne spécifie pas un prog ou CLSID.

23
demandé sur Jeff Mercado 2011-08-24 01:19:17

3 réponses

le CLSID pour le moteur Javascript Chakra installé avec IE9 est

{16d51579-a30b-4c8b-a276-0ff4dc41e755} .

le InProcServer32 est %windir%\System32\jscript9.dll .

il n'y a pas de Progide que j'ai pu trouver. C'est un peu bizarre; normalement, les entrées de programme et de CLSID se réfèrent l'une à l'autre. Pour un objet COM donné, la clé de programme dans le registre a une sous-clé appelée CLSID, et la clé de registre CLSID a une sous-clé appelée Prog ID, et ils se réfèrent à mutuellement. Mais la sous-clé de programmation pour le CLSID IE9 est "JScript", qui se réfère bien sûr à la v5.8 Jscript CLSID. Je ne suis pas sûr que ce soit une erreur de Microsoft, ou un peu d'obscurcissement délibéré, parce qu'ils ne veulent pas que quelqu'un utilise le moteur Chakra en dehors de IE9. Regarde délibérée pour moi.


j'ai appris l'existence du CLSID en effectuant simplement une recherche dans le Registre pour trouver jscript9.DLL.


si vous avez Code .NET qui héberge les moteurs de Script, vous pouvez instancier l'objet IActiveScript pour le moteur IE9 javascript ("Chakra") en utilisant le CLSID directement. Le code doit ressembler à ceci:

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;

dans ce qui précède, clsIdPattern est une expression régulière qui correspond au format GUID familier, avec ou sans boucles environnantes.

étant donné le code ci-dessus, vous pouvez passer "jscript", "Javascript", ou" ECMAScript " et obtenir le v5.8 Moteur JScript. Ou vous pouvez passer " {16d51579-a30b-4c8b-a276-0ff4dc41e755}" et obtenir le moteur IE9 Javascript. Évidemment, vous devez avoir IE9 installé afin que cela fonctionne.

je viens d'essayer ceci et cela fonctionne pour les cas simples. Je vais encore jouer avec ça, très bientôt.


si vous voulez exécuter Chakra à partir de WSH, comme à partir de cscript.exe, alors tu auras besoin d'un Progide, je pense.

Si Je crée "Chakra" comme un programme dans le registre, se référant au CLSID correct, je peux exécuter des fichiers JS à travers le moteur de IE9 comme ceci:

cscript.exe  module.js  //E:Chakra 

par exemple, après avoir inséré le nouveau programme" Chakra", donné un script comme celui-ci:

WScript.Echo( ScriptEngineMajorVersion() + "." +
              ScriptEngineMinorVersion() + "." +
              ScriptEngineBuildVersion());

...la sortie est comme ceci:

C:\dev\js>Version.js
5.8.16982

C:\dev\js>cscript.exe Version.js  //E:Chakra
9.0.16434

et voici le résultat d'un test de cryptage AES en Javascript, comparant Chakra avec 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

pour définir le programme dans mon registre, j'ai utilisé ceci:

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]

et pour désactiver Chakra, ou inverser le registre, j'ai fait ceci:

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]

ce script de Registre a fonctionné avec x64 Windows; si vous n'avez pas x64, alors vous aurez besoin de supprimer les lignes WOW6432Node.

32
répondu Cheeso 2011-08-24 04:01:23

peut-être un peu en retard, mais:

vous pouvez aussi simplement spécifier le CLSID du moteur que vous voulez utiliser via l'argument //E:

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

Edit: , Selon Cheeso de réponse, j'ai trouvé qu'il suffit d'ajouter les entrées de registre suivantes pour pouvoir utiliser jscript9 sans préciser le CLSID. J'utilise le nom de clé JScript9 ici, vous pouvez le remplacer par Chakra si vous voulez. Le nom de la clé est ce que vous spécifiez après / / E: puis:

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]

et ensuite:

cscript.exe  <file>  //E:JScript9
7
répondu imagiro 2013-07-02 13:58:41

vous pouvez maintenant appeler L'exécution Chakra directement à travers les api publiées et vous n'avez plus à utiliser IActiveScript.

voici un article sur MSDN montrant comment héberger le chakra runtime en C++ ou C#:

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

2
répondu justin.m.chase 2014-01-16 16:25:23