如何解决使用作为 expando 的构造函数创建 C# 类
我想知道是否可以在早期 IE 版本中创建一个类似于 ActiveXObject 的类并将其传递给 MS ClearScript?我找到了一段代码,它使用字符串名称创建 ActiveXObjects 的实例。
class ActiveXObject
{
public ActiveXObject(string progID)
{
try
{
dynamic wshShell = Activator.CreateInstance(Type.GetTypeFromProgID(progID));
}
catch
{
return null;
}
}
}
这是将 c# 对象附加到 MS ClearScript 对象的代码
using (var engines = new V8ScriptEngine())
{
engines.AddHostObject("ActiveXObject",new ActiveXObject());
}
唯一的问题是如何将wshshell分配给类的实例?顺便说一句,这是出于教育目的。
解决方法
如果您将 ActiveXObject
实现为 JavaScript 构造函数,它可以返回任意对象。如果失败,它不能返回 null
,但您可以解决这个问题:
dynamic setup = engine.Evaluate(@"
(function (factory) {
ActiveXObject = function (progID) {
return factory(progID) ?? { valueOf: () => null };
}
})
");
Func<string,object> factory = progID => {
try {
return Activator.CreateInstance(Type.GetTypeFromProgID(progID));
}
catch {
return null;
}
};
setup(factory);
现在您可以执行以下操作:
engine.AddHostType(typeof(Console));
engine.Execute(@"
let fso = new ActiveXObject('Scripting.FileSystemObject');
if (fso.valueOf()) {
for (let drive of fso.Drives) {
Console.WriteLine(drive.Path);
}
}
");
请注意,原始 ActiveXObject
在失败情况下也没有返回 null
;它抛出异常。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。