简体   繁体   中英

Interface inheritance in ComVisible classes in C#

Inherited property (P1) is not accessable from w/cscript.

Class structure looks something like this :

[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";}}
}

Client code in js file :

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

if i add property P1 to interface IB, everything works fine, but whats the point of inheritance then? Or am i doing here something really wrong?

I'm stealing the answer to this from the COM Interop: Base class properties not exposed to COM link given in the very similar question "C# exposing to COM - interface inheritance"

In particular the MVP on that site states:

In COM interfaces can inherit from one another. However the .NET implementation that exposes the .NET interface to COM does not support inheritance. Therefore you must replicate any interface members in a base interface to the derived interface... The interop code does not look at base interface types when building the exposed COM interface.

It does suggest some workarounds, such as inheriting from both interfaces, or implementing a 'native' TLB (write the inteface in IDL and compile it with MIDL - there should be projects for this in vis studio).

The code seems fine and it should work as intended except of course that you have omitted the return type of the two properties, they should be:

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

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

But I am assuming this is just an overlook in the code you wrote in your post.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM