dire che ho un BaseClass classe che implementa IBaseClassC# esporre a COM - Interfaccia eredità
Poi ho un IClass interfaccia che eredita IBaseClass.
Quindi ho una classe denominata classe che implementa IClass.
Ad esempio:
[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"; }
}
Quando si espone al COM, se faccio un esempio di "Class" non permette che chiami Geta().
Quando si cerca il mio IDL nel file TLB, la mia interfaccia IClass assomiglia:
[
odl,
uuid(XXXXXXXXXXXXXXXXXXXXX),
version(1.0),
dual,
oleautomation,
]
interface IClass : IDispatch {
[id(0x60020000)]
BSTR GetB();
}
Non sembra nemmeno IClass deriva da IBaseClass!
Se tengo fuori da dove IClass deriva da IBaseClass e basta aggiungere i metodi all'interfaccia, funziona.
Come posso rendere C# abilitare questa ereditarietà in COM? Preferisco non ri-implementare le interfacce quando posso ereditarle.
CRAP: controllare questo link .Net COM Limitation
Se qualcuno ha una risposta a questo è il motivo per cui, o una soluzione migliore di copia-incolla per la mia interfaccia "derivata", me lo faccia sapere. Se no, segnerò una risposta tra un paio di giorni.
È necessario eseguire una query per le altre interfacce per accedere ai metodi al loro interno. A seconda della lingua da cui si utilizza l'oggetto, potrebbe essere sconveniente. Per aggirare il problema è necessario creare un'interfaccia "piatta" per ogni classe o lasciare che sia il compilatore a farlo per te con "ClassInterface" (che ha altri problemi) – adrianm
Se vedi il mio link, il rispondente accenna che .Net fa non applicare le interfacce di base alle interfacce COM quando esportate. Quindi, in altre parole, è necessario copiare e incollare la definizione dell'interfaccia di base per simulare un'interfaccia di base. – jonathanpeppers
Penso che dovresti pubblicare il tuo link di limitazione COM .Net come risposta - è la soluzione corretta, e si consiglia di pubblicare la propria risposta se l'hai capito da solo. – bacar