decir que tengo una clase que implementa BaseClass IBaseClassC# exponer a COM - herencia de interfaces
entonces tengo una iclass interfaz que hereda IBaseClass.
Luego tengo una clase llamada clase que implementa IClass.
Por ejemplo:
[ComVisible(true), InterfaceType(ComInterfaceType.IsDual), Guid("XXXXXXX")]
public interface IBaseClass
{
[PreserveSig]
string GetA()
}
[ComVisible(true), InterfaceType(ComInterfaceType.IsDual), Guid("XXXXXXX")]
public interface IClass : IBaseClass
{
[PreserveSig]
string GetB()
}
[ComVisible(true), ClassInterface(ClassInterfaceType.None), Guid("XXXXXXX")]
public class BaseClass : IBaseClass
{
public string GetA() { return "A"; }
}
[ComVisible(true), ClassInterface(ClassInterfaceType.None), Guid("XXXXXXX")]
public class Class : BaseClass, IClass
{
public string GetB() { return "B"; }
}
Al exponer a COM, si hago una instancia de "clase" que no permite que llame a Geta().
Al mirar mi IDL en el archivo .tlb, mi interfaz iclass parece:
[
odl,
uuid(XXXXXXXXXXXXXXXXXXXXX),
version(1.0),
dual,
oleautomation,
]
interface IClass : IDispatch {
[id(0x60020000)]
BSTR GetB();
}
No siquiera se parece iclass deriva de IBaseClass!
Si saco donde IClass se deriva de IBaseClass y simplemente agrego los métodos a la interfaz, funciona.
¿Cómo puedo hacer que C# habilite esta herencia en COM? Prefiero no volver a implementar interfaces cuando puedo heredarlas.
CRAP: comprobar este enlace .Net COM Limitation
Si alguien tiene una respuesta a por qué esto es, o una solución mejor que copiar y pegar a mi interfaz "derivados", que me haga saber. Si no, marcaré una respuesta en un par de días.
Necesita consultar las otras interfaces para acceder a métodos en ellas. Dependiendo del idioma del que use el objeto, podría ser un inconveniente. Para solucionarlo, necesita crear una interfaz "plana" para cada clase o dejar que el compilador lo haga por usted con "ClassInterface" (que tiene otros problemas) – adrianm
Si ve mi enlace, el contestador menciona que .Net lo hace no aplique interfaces base a las interfaces COM cuando se exporte. En otras palabras, debe copiar y pegar la definición de la interfaz base para simular una interfaz base. – jonathanpeppers
Creo que debería publicar su propio enlace .Net COM Limitation como una respuesta: es la solución correcta, y se recomienda publicar su propia respuesta si lo descubrió usted mismo. – bacar