我可以通过 COM 从 VBA 调用 C# 类的静态方法吗?

Posted

技术标签:

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

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

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

【问题讨论】:

msdn.microsoft.com/en-us/library/ms182198.aspx是你的问题吗? 您需要创建一个实例方法来包装 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。尽管如此,我强烈建议您创建一个合适的工厂。 【参考方案1】:

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

[ComVisible(true)]
public class Foo

    [ComVisible(false)]
    public static void Bar() 

    public void BarInst()
    
        Bar();
    

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

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

【讨论】:

【参考方案2】:

COM 不支持静态方法。

http://msdn.microsoft.com/en-us/library/ms182198.aspx

【讨论】:

以上是关于我可以通过 COM 从 VBA 调用 C# 类的静态方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 运行 Excel 宏:从 VBA 捕获运行时错误

从 C# 访问 VBA 函数

我可以从 C# 中同一类的另一个构造函数调用重载构造函数吗?

C#最新功能(6.07.0)

传递VBA类的实时实例时,C#ITypeInfo.GetContainingTypeLib失败

C# 应用程序在对 COM 类的方法调用时崩溃