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などの値をとることができます。コマンドラインでオプションを指定してprogIdを指定すると、cscript.exeを実行するときに同様のことができ//Eます。たとえば、次のコマンドは次のとおりです。

cscript.exe  <file>  //e:JScript

..拡張子に関係なく、指定されたファイルをJScriptエンジンを介して実行します。

私のマシンでは、を見るとHKLM\SW\Classes\、3つのprogId {Javascript、JScript、ECMAScript}はすべて同じCLSIDを指しています。これは、JScript5.8スクリプトエンジンだと思います。{f414c260-6ac0-11cf-b6d1-00aa00bbbb58}

IE9のJavascriptエンジン(別名「チャクラ」)を実行するために指定できるProgIdまたはCLSIDはありますか?

IE9のエンジンはまだIActiveScriptによってロードされますか?
Microsoftのドキュメントでは、ProgIdまたはCLSIDは指定されていませんが、指定されていることが示されています。

4

3 に答える 3

33

IE9でインストールされたChakraJavascriptエンジンのCLSIDはです
{16d51579-a30b-4c8b-a276-0ff4dc41e755}

InProcServer32は%windir%\System32\jscript9.dll です。

私が見つけたProgIdはありません。それは少し奇妙です。通常、ペアになっているProgIdエントリとCLSIDエントリは相互に参照します。特定のCOMオブジェクトについて、レジストリのProgIdキーにはCLSIDと呼ばれるサブキーがあり、CLSIDレジストリキーにはProgIdと呼ばれるサブキーがあり、それらは相互に参照します。ただし、IE9 CLSIDのProgIdサブキーは「JScript」です。これはもちろん、v5.8JscriptCLSIDを参照します。これがMicrosoftによる間違いなのか、それとも意図的な難読化なのかはわかりません。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.8JScriptエンジンを取得できます。または、「{16d51579-a30b-4c8b-a276-0ff4dc41e755}」を渡して、IE9Javascriptエンジンを取得することもできます。明らかに、これを機能させるにはIE9をインストールする必要があります。

私はこれを試したところ、単純なケースで機能します。もう少し、本物で遊んでみます。


cscript.exeのようにWSHからChakraを実行する場合は、ProgIdが必要になると思います。
レジストリにProgidとして「Chakra」を作成し、正しい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をJScript5.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]

このレジストリスクリプトはx64Windowsで機能しました。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の後に指定するものです:then:

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なくなりました。

これは、C ++またはC#でChakraランタイムをホストする方法を示すMSDNの記事です。

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 に答える