我正在努力制作一个由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
非常感谢任何帮助
答案 0 :(得分:0)
Class1
隐含internal
,因为您未指定可见性级别。
将其更改为
[ClassInterface(ClassInterfaceType.None)]
[ProgId("Libname.Class1")]
[ComVisible(true)]
public class Class1 : _Class1
{
下记录
只有公共类型可见。该属性不能用于使COM可见的内部或受保护类型或使不可见类型的成员可见。