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

时间:2017-03-27 15:46:21

标签: c# wcf com-interop regasm

我正在努力制作一个由VBA使用的类库。我在项目中有一个班级可以工作,但第二个班似乎没有被注册。如果我使用VBS进行测试,CreateObject(“Libname.Class2”)可以工作,但CreateObject(“Libname.Class1”)给出了“ActiveX组件无法创建对象”错误。 RegAsm没有给出任何有用的反馈 - 它只是说某些类型被导出但是没有告诉我为什么其他类型没有。我也只能在OleView中找到Class2。

与此类错误相关的问题的大部分答案都是指使用RegAsm的错误版本(x86 / x64)的情况,但鉴于一个类成功注册,我无法想象这是案件(我正在注册这两个版本)。还有一些答案建议确保默认构造函数中包含某些内容,以便它们不会被优化,但这似乎也没有帮助。

两者具有完全相同的属性(除了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实际上是一个Factory对象,可以进行一些WCF设置。我不知道在以前注册的程序集中添加一个类是否会导致问题(如果是这样,我将如何修复它)?

以下VBS按预期工作:

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

非常感谢任何帮助

1 个答案:

答案 0 :(得分:0)

Class1隐含internal,因为您未指定可见性级别。

将其更改为

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

这在ComVisibleAttribute

下记录
  

只有公共类型可见。该属性不能用于使COM可见的内部或受保护类型或使不可见类型的成员可见。