我可以通过 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# 中同一类的另一个构造函数调用重载构造函数吗?