为什么程序集中的某些 类 会暴露给 COM,而其他的则不会?

Why would some classes in an assembly be exposed to to COM but not others?

我正在努力制作一个 Class 库供 VBA 使用。我在项目中得到了一个 class 来工作,但第二个似乎没有被注册。如果我使用 VBS 进行测试,CreateObject("Libname.Class2") 可以工作,但 CreateObject("Libname.Class1") 会出现 "ActiveX component can't create object" 错误。 RegAsm 没有提供任何有用的反馈——它只是说某些类型已导出,但没有告诉我为什么其他类型没有。我也只能在OleView中找到Class2。

大多数与此类错误相关的问题的答案都涉及使用错误版本 (x86/x64) 的 RegAsm 的情况,但考虑到 class 已成功注册我无法想象会是这种情况(无论如何我都在注册这两个版本)。还有一些答案建议确保默认构造函数中包含一些东西,这样它们就不会被优化掉,但这似乎也没有帮助。

两者属性完全相同(ProgId除外),接口也比较相似:

[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[ComVisible(true)]
public interface _Class1
{
    _Class2 GetClass2();

    string testertong { get; }
}

[ClassInterface(ClassInterfaceType.None)]
[ProgId("Libname.Class1")]
[ComVisible(true)]
class Class1 : _Class1
{
    private ...;

    public Class1 ()
    {
        /* Constructor stuff - commenting it out doesn't help */
    }

    public _Class2 GetClass2()
    {
        /* Generate and return an instance of Class2.  Tried return null too */
    }

    public string testertong
    {
        get
        {
            return "I love yams";
        }
    }
}

[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[ComVisible(true)]
public interface _Class2
{
    ArrayList GetLog(int entries);

    string testytest { get; }
}

[ClassInterface(ClassInterfaceType.None)]
[ProgId("Libname.Class2")]
[ComVisible(true)]
public class Class2 : _Class2
{
    internal IThing client;

    public Class2()
    {
        /* Currently empty but works fine */
    }

    public ArrayList GetSubmissionLog(int entries)
    {
        return new ArrayList(client.GetSubmissionLog(entries));
    }

    public string testytest
    {
        get { return "wololo"; }
    }
}

Class2 实际上是我创建和编译的两个中的第一个。 Class1 实际上将成为工厂对象以进行一些 WCF 设置。我不知道向先前注册的程序集添加 class 是否会导致问题(如果是,我将如何解决)?

以下 VBS 按预期工作:

Set y = CreateObject("Libname.Class2")
Msgbox y.testytest

非常感谢任何帮助

Class1 隐式 internal 因为您没有指定可见性级别。

改为

[ClassInterface(ClassInterfaceType.None)]
[ProgId("Libname.Class1")]
[ComVisible(true)]
public class Class1 : _Class1
{

这记录在 ComVisibleAttribute 下:

Only public types can be made visible. The attribute cannot be used to make an otherwise internal or protected type visible to COM or to make members of a nonvisible type visible.