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

我可以通过COM从VBA调用C#类的静态方法吗?,c#,.net,vba,com,interop,C#,.net,Vba,Com,Interop,如果我在C#/.NET类库中定义一个类,那么通过使其COM可见,我可以实例化该类并使用COM从VBA调用其方法 有没有办法从VBA调用此类的静态方法?COM不支持静态方法,COM对象的实例也不调用静态方法。相反,在静态方法上设置ComVisible(false),然后创建一个实例方法来包装它: [ComVisible(true)] public class Foo { [ComVisible(false)] public static void Bar() {} pub

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


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

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

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

    public void BarInst()
    {
        Bar();
    }
}
或者只是让方法成为实例,而不是静态的,然后一起忘记静态


您不必将静态方法标记为COM不可见,但是它满足一些代码分析工具的要求,这些工具会警告您COM可见类型上的静态方法,并明确说明静态方法不打算对COM可见。

COM不支持静态方法


这是您的问题吗?您需要创建一个实例方法来包装COM的静态方法。@JackMalkovich:链接上说“COM不支持静态方法”,所以是的,这确实回答了我的问题(“否”)。请随便回答。@vcsjones:是的,我可以,但这正是我试图避免的。我有一个不需要默认构造函数的类,我计划使用一个静态Create()方法来允许COM调用方创建它们。看起来Create方法必须是另一个类的实例成员。多好的PITA。您可以执行
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
。尽管如此,我强烈建议您创建一个合适的工厂。