繁体   English   中英

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

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

我正在努力制作供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实际上将成为执行一些WCF设置的Factory对象。 我不知道将类添加到先前注册的程序集是否会引起问题(如果这样,我将如何解决)?

以下VBS可以正常工作:

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

非常感谢任何帮助

由于未指定可见性级别,所以Class1是隐式internal

更改为

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

这记录在ComVisibleAttribute下:

只有公共类型可以显示。 该属性不能用于使其他内部或受保护的类型对COM可见,或使不可见类型的成员可见。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM