C#中ComVisible类中的接口inheritance

无法从w / cscript访问inheritance的属性(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,一切正常,但那么inheritance点是什么呢? 或者我在这里做错了什么?

我正在从COM Interop窃取这个问题的答案:在类似的问题“C#暴露给COM – 接口inheritance”中给出的基本类属性没有暴露给COM链接

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

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

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

代码似乎很好,它应该按预期工作,除了你已经省略了两个属性的返回类型,它们应该是:

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

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