首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#中ComVisible类中的接口继承

C#中ComVisible类中的接口继承
EN

Stack Overflow用户
提问于 2009-09-09 14:09:00
回答 2查看 4.8K关注 0票数 5

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

类结构如下所示:

代码语言:javascript
运行
复制
[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文件中的客户端代码:

代码语言:javascript
运行
复制
try{
var obj = new ActiveXObject("Concrete");
WshShell.Popup(obj.P1); //<-- displays empty string
}catch(e)
{
WshShell.Popup(e.description);
}

如果我将属性P1添加到接口IB,一切都可以正常工作,但是继承的意义是什么呢?还是我真的做错了什么?

EN

回答 2

Stack Overflow用户

发布于 2010-09-23 05:06:39

我从非常类似的问题"C# exposing to COM - interface inheritance"中提供的COM Interop: Base class properties not exposed to COM链接中窃取了这个问题的答案

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

COM接口中的

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

它确实建议了一些变通方法,比如从两个接口继承,或者实现一个“本地”TLB (用IDL编写接口并用MIDL编译它- vis studio中应该有这样的项目)。

票数 8
EN

Stack Overflow用户

发布于 2009-09-09 14:16:11

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

代码语言:javascript
运行
复制
[ComVisible]
public abstract class Base : IA
{
    public string P1{get{return "somestring";}}
}   

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

但我假设这只是你在帖子中写的代码中的一个疏忽。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1399928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档