在C#中标记有ComVisible特性的类接口继承(Interface inheritance in

2019-07-17 12:19发布

继承的属性(P1)是不是从瓦特/ CSCRIPT accessable。

类结构看起来是这样的:

[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,一切工作正常,但什么继承的点呢? 还是我在这里做的东西真的错了吗?

Answer 1:

我偷了这个问题的答案从COM互操作:基本类的属性不会暴露COM的非常类似的问题给出的链接“C#暴露在COM -接口继承”

特别是在该网站上的MVP指出:

在COM接口可以彼此继承。 但是,这种公开.NET接口,COM的.NET实现不支持继承。 因此,你必须复制在基本接口派生的接口的任何接口会员...建筑暴露COM接口时,互操作的代码不看基本接口类型。

它提出了一些解决方法,比如从两个接口继承,或实施“天然” TLB(写inteface在IDL和MIDL与编译 - 应该有这可见工作室项目)。



Answer 2:

该代码似乎罚款和意图当然除了你省略这两个属性的返回类型的它应该工作,应该是:

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

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

但我假定这只是你在帖子中写道代码中的疏忽。



文章来源: Interface inheritance in ComVisible classes in C#
标签: c# com interface