Наследование 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". Можно ли обойтись без дублирования методов?


Ответы (0 шт):