Скажем, у меня есть класс BaseClass, который реализует IBaseClass
Тогда у меня есть интерфейс IClass, который наследует IBaseClass.
Тогда у меня есть класс с именем class, который реализует IClass.
Например:
[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"; }
}
При использовании COM, если я создаю экземпляр класса, это не позволяет мне вызывать GetA ().
При просмотре моего IDL в файле .tlb мой интерфейс IClass выглядит следующим образом:
[
odl,
uuid(XXXXXXXXXXXXXXXXXXXXX),
version(1.0),
dual,
oleautomation,
]
interface IClass : IDispatch {
[id(0x60020000)]
BSTR GetB();
}
Это даже не похоже на то, что IClass является производным от IBaseClass!
Если я возьму, откуда IClass наследуется от IBaseClass, и просто добавлю методы в интерфейс, он будет работать.
Как я могу заставить C # включить это наследование в COM? Я бы предпочел не повторно реализовывать интерфейсы, когда я могу их наследовать.
CRAP: проверьте эту ссылку .Net COM ограничение
Если у кого-то есть ответ на вопрос, почему это так, или лучший обходной путь, чем копирование-вставка в мой «производный» интерфейс, дайте мне знать. Если нет, я отмечу ответ через пару дней.