Как экспортировать интерфейс, написанный на C#, чтобы получить код Delphi, сгенерированный TLB - PullRequest
3 голосов
/ 08 апреля 2020

В настоящее время я разрабатываю замену старого интерфейса COM (который используется для связи с другими устройствами). Этот интерфейс в настоящее время используется в большом приложении. Старый интерфейс COM теперь не поддерживается автором библиотеки, которую они только поддерживают и развивают C# интерфейс. Моя задача - разработать вышеупомянутую замену. Который действует как прокси между старым приложением (написано в Delphi) и новым интерфейсом на основе C#. Я пытаюсь сделать как можно меньше изменений кода в основном приложении. Поэтому я стараюсь имитировать c старый интерфейс как можно лучше. Поэтому я пишу код в C#, который затем экспортируется в файл TLB. Файл TLB используется для генерации копии Delphi с помощью команды «TLIBIMP.EXE -P».

Это код, созданный с использованием старого интерфейса. Как вы можете видеть, есть свойство Cat, которое можно вызвать с индексом, чтобы получить соответствующий элемент коллекции за ним.

IDFoo = interface(IDispatch)
    ['{679F4D30-232F-11D3-B461-00A024BEC59F}']
    function Get_Cat(Index: Integer): IDFoo; safecall;
    procedure Set_Cat(Index: Integer; const Evn: IDFoo); safecall;
    property Cat[Index: Integer]: IDFoo read Get_Cat write Set_Cat;
end;

Я пытаюсь получить аналог C#, который производит TLB-файл со свойством Cat [index].

Итак, мое решение на данный момент таково: C#:

[ComVisible(true)]
[Guid("821A3A07-598B-450D-A22B-AA4839999A18")]
public interface ICat
{
    ICat this[int index] { get; set; }
}

И это приводит к TLB, который затем приводит к Delphi коду:

  ICat = interface(IDispatch)
    ['{821A3A07-598B-450D-A22B-AA4839999A18}']
    function Get_Item(index: Integer): ICat; safecall;
    procedure _Set_Item(index: Integer; const pRetVal: ICat); safecall;
    property Item[index: Integer]: ICat read Get_Item write _Set_Item; default;
  end;

Все идет нормально. Но свойство называется «Предмет», а не как оригинал «Кошка». У кого-нибудь есть подсказка, как мне этого добиться?

1 Ответ

4 голосов
/ 08 апреля 2020

Item - это имя по умолчанию для C# индексаторов.

Первая возможность - просто переименовать Item в Cat в сгенерированном коде Delphi.

Вторая возможность - указать имя индексатора C#:

[System.Runtime.CompilerServices.IndexerName("Cat")]
public ICat this[int index] { get; set; }
...