【问题标题】:Can I call a static method of a C# class from VBA via COM?我可以通过 COM 从 VBA 调用 C# 类的静态方法吗?
【发布时间】:2014-08-03 07:07:21
【问题描述】:

如果我在 C#/.NET 类库中定义一个类,那么通过使其 COM 可见,我可以实例化该类并使用 COM 从 VBA 调用其方法。

有没有办法从 VBA 中调用此类的静态方法?

【问题讨论】:

  • 您需要创建一个实例方法来包装 COM 的静态方法。
  • @JackMalkovich:链接说“COM 不支持静态方法”,所以是的,这确实回答了我的问题(“否”)。随意将其作为答案。
  • @vcsjones:是的,我可以,但这是我试图避免的。我有一个不需要默认构造函数的类,我计划使用静态 Create() 方法来允许 COM 调用者创建它们。看起来 Create 方法必须是另一个类的实例成员。什么皮塔饼。
  • 您可以使用Dim ClassObject: Set ClassObject = GetObject("clsid:CLSID")(其中CLSID 是没有{} 的字符串格式化程序类ID)来获取类对象。我从未尝试过使用 C#/.NET 类,但如果类支持 IDispatch,您可以使用它来执行 Dim Object: Set Object = ClassObject.Create(),而不是更常见的 Dim Object: Set Object = CreateObject("Prog.Id"),它将调用类的 IClassFactory::CreateInstance。尽管如此,我强烈建议您创建一个合适的工厂。

标签: c# .net vba com interop


【解决方案1】:

COM 不支持静态方法,并且 COM 对象的实例不调用静态方法。相反,在你的静态方法上设置ComVisible(false),然后创建一个实例方法来包装它:

[ComVisible(true)]
public class Foo
{
    [ComVisible(false)]
    public static void Bar() {}

    public void BarInst()
    {
        Bar();
    }
}

或者只是创建方法实例而不是静态的,然后一起忘记静态。

您没有必须将静态方法标记为对 COM 不可见,但它满足一些代码分析工具的要求,这些工具会警告您关于 COM 可见类型的静态方法,并清楚地表明静态方法不打算对 COM 可见。

【讨论】:

    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2015-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多