【问题标题】:Create C# class with constructor that acts as expando使用充当扩展的构造函数创建 C# 类
【发布时间】:2021-04-08 11:58:36
【问题描述】:

我想知道是否可以在早期的 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 分配给类的实例?顺便说一句,这是出于教育目的。

【问题讨论】:

    标签: c# class dynamic activex expandoobject


    【解决方案1】:

    如果您将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;它引发了异常。

    【讨论】:

      猜你喜欢
      • 2014-04-18
      • 2013-11-15
      • 1970-01-01
      • 2021-02-13
      • 2014-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多