Наследование COM-интерфейсов в delphi и c#
В проекте на delphi имеется класс, реализующий интерфейсы, связанные наследованием:
//Интерфейсы
ITestA = interface(IUnknown)
['{0612502C-D858-4C95-AE73-0C83A05F0F41}']
procedure PrintA; stdcall;
end;
ITestB = interface(ITestA)
['{1A5DD22B-F95D-46B8-BBA8-2309B665D664}']
procedure PrintB; stdcall;
end;
//Класс
TApiTestAB = class(TInterfacedObject, ITestA, ITestB)
public
procedure PrintA; stdcall;
procedure PrintB; stdcall;
end;
//Реализация методов класса
procedure TApiTestAB.PrintA;
begin
MessageBox(GetDesktopWindow, 'A', '', 0);
end;
procedure TApiTestAB.PrintB;
begin
MessageBox(GetDesktopWindow, 'B', '', 0);
end;
Имеется dll на c#, внутри которой имеются интерфейсы, соответствующие интерфейсам из delphi.
[ComImport, Guid("0612502C-D858-4C95-AE73-0C83A05F0F41")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITestA
{
[MethodImpl(MethodImplOptions.PreserveSig)]
void PrintA();
}
[ComImport, Guid("1A5DD22B-F95D-46B8-BBA8-2309B665D664")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITestB : ITestA
{
#region ITestA
[MethodImpl(MethodImplOptions.PreserveSig)]
new void PrintA();
#endregion
[MethodImpl(MethodImplOptions.PreserveSig)]
void PrintB();
}
На delphi экспортируется метод, в котором создается экземпляр TApiTestAB и возвращается как интерфейс ITestB. Этот метод вызывается на стороне c#. Далее вызываются функции интерфейса для проверки работы.
ITestB t = null;
ACore.CreateTestAB(out t);
t.PrintA();
t.PrintB();
Marshal.FinalReleaseComObject(t);
PrintA выводит "A", а PrintB выводит "B", как и требуется. Проблема в том, что в c# приходится дублировать методы из наследуемых интерфейсов (которые в области region). Если из ITestB убрать PrintA, то при вызове t.PrintB() выведется "A". Можно ли обойтись без дублирования методов?