[英]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.