ie9的Javascript引擎(代号Chakra")的ProgId或CLSID是什么?
What is the ProgId or CLSID for IE9's Javascript engine (code-named "Chakra")
使用。net,我可以编写一个承载脚本引擎的应用程序,它符合微软的IActiveScript约定。这包括微软的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'
,三个progid {Javascript, JScript, ECMAScript}都指向相同的CLSID,我猜是JScript 5.8脚本引擎:{f414c260-6ac0-11cf-b6d1-00aa00bbbb58}
是否有一个ProgId或CLSID我可以指定运行IE9的Javascript引擎,又名"Chakra"?
IE9的引擎仍然被IActiveScript加载吗?
微软的文档建议这样做,但没有指定ProgId或CLSID。
与IE9一起安装的Chakra Javascript引擎的CLSID为{16d51579-a30b-4c8b-a276-0ff4dc41e755}
。
InProcServer32 is %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格式,可以带或不带周围的花括号。
我刚刚尝试了这个,它适用于简单的情况。我很快就会更多地使用它。
如果你想从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行。
可能有点晚了,但是:
你也可以通过//E参数指定你想要使用的引擎的CLSID:
<>以前cscript.exe & lt; file>//E: {16 d51579-a30b-4c8b-a276-0ff4dc41e755} 之前Edit:根据Cheeso的回答,我发现添加以下注册表项足以在不指定CLSID的情况下使用jscript9。我在这里使用密钥名称JScript9,如果您喜欢,您可以将其替换为Chakra。键名是在//E: then:
之后指定的。<>之前Windows注册表编辑器版本5.00(HKEY_LOCAL_MACHINE ' SOFTWARE ' ' JScript9类)@ = " JScript9语言"[HKEY_LOCAL_MACHINE ' SOFTWARE ']类' JScript9 ' CLSID@ = " {16 d51579-a30b-4c8b-a276-0ff4dc41e755} "[HKEY_LOCAL_MACHINE ' SOFTWARE ' ' JScript9 ' OLEScript类)之前然后:
<>以前cscript.exe & lt; file>//E: JScript9你现在可以直接通过发布的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上)
- 这是什么 ==- javascript 运算符
- 我的单元测试选项是什么
- 打破承诺链的好方法是什么
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- Javascript中的空白是什么
- 是什么让一个“;Uncaught RangeError:超过了最大调用堆栈大小“;错误(Chrome,在其他浏览器中显示
- 在JavaScript中拆分日期字符串的更好方法是什么
- 将jQuery.ech()方法转换为本地JavaScript抽象的最佳方法是什么
- 处理浮点错误的最佳方法是什么
- javascript导入的最佳实践是什么
- 基于窗口宽度jquery的函数的替代方法是什么
- 在ng重复循环中显示条件内容的最佳方式是什么
- 我的客户端选项是什么
- 这是什么“;要求“;事情
- 未捕获的类型错误:topFrame.window.changeSelectedBarStyle不是函数,原因是什么
- 实现比较方法的最佳实践是什么;s的比较类型是在运行时选择的
- @@(“at at”)在ES6 JavaScript中是什么意思
- knex:根据结果创建数组的合适方法是什么
- JSDoc:模块和名称空间之间的关系是什么
- ie9的Javascript引擎(代号Chakra")的ProgId或CLSID是什么?