C#中ComVisible类中的接口继承

时间:2009-09-09 14:09:00

标签: c# com interface

无法从w / cscript访问继承属性(P1)。

类结构看起来像这样:

[ComVisible]
public interface IA 
{
     string P1{get;} 
} 

[ComVisible]
public interface IB : IA
{
    string P2{get;} 
}

[ComVisible]
public abstract class Base : IA
{
    public string P1{get{return "somestring";}}
}   

[ComVisible]
public class Concrete : Base, IB
{
   public string P2{get{return "P2somestring";}}
}

js文件中的客户端代码:

try{
var obj = new ActiveXObject("Concrete");
WshShell.Popup(obj.P1); //<-- displays empty string
}catch(e)
{
WshShell.Popup(e.description);
}

如果我将属性P1添加到接口IB,一切正常, 但那么继承的重点是什么呢?或者我在这里做错了什么?

2 个答案:

答案 0 :(得分:7)

我从非常相似的问题COM Interop: Base class properties not exposed to COM

中给出的"C# exposing to COM - interface inheritance"链接中窃取了答案

特别是该网站上的MVP声明:

  

在COM接口中可以相互继承。但是,向.NET公开.NET接口的.NET实现不支持继承。因此,您必须将基接口中的任何接口成员复制到派生接口...在构建公开的COM接口时,互操作代码不会查看基接口类型。

它确实提出了一些解决方法,例如从两个接口继承,或实现'本机'TLB(在IDL中编写接口并使用MIDL编译它 - 在vis studio中应该有这样的项目)。

答案 1 :(得分:1)

代码看起来很好,它应该按预期工作,当然除了你省略了两个属性的返回类型,它们应该是:

[ComVisible]
public abstract class Base : IA
{
    public string P1{get{return "somestring";}}
}   

[ComVisible]
public class Concrete : Base, IB
{
   public string P2{get{return "P2somestring";}}
}

但我认为这只是你在帖子中写的代码中的一个忽略。