我已经按照Microsoft的设计规则为C#库创建了一个COM包装器,并且在通过脚本(VB脚本)或TLB C ++进行消费时,一切似乎都能正常工作。
最近,我们尝试通过Internet Explorer 11中的ActiveX进行使用,并且只有某些功能可用。查明罪魁祸首花了几个小时。 因此,我有一个工厂类来授予对特定数据库的访问权限,并且公开了接口和类,以便COM用户可以创建工厂的实例对象:
[ComVisible(true)]
[Guid("...")]
public interface IFactory
{
IDbAccess CreateDbAccess(string param);
}
[ComVisible(true)]
[Guid("....")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("Company.Factory")]
public class Factory: IFactory
{
public Factory()
{ }
public virtual IDbAccess CreateDbAccess(string param)
{
return new DbAccess(param);
}
}
在实际创建对数据库的访问时,用户应调用:factory.CreateDbAccess(...)
,然后使用IDbAccess接口。此方法使用javascript返回undefined
。
[ComVisible(true)]
[Guid("...")]
public interface IDbAccess
{
string Read();
}
internal class DbAccess: IDbAccess
{
public string Read();
}
如果我将DbAccess
类设为public并应用ComVisibile(true)
属性,它将起作用。
谁能解释为什么?我认为该接口足以使用它(在VBScripting中似乎是如此)。
谢谢