如何导出用C#编写的接口以实现TLB生成的Delphi代码 - c#

我目前正在开发旧COM接口(用于与其他设备进行通信)的“嵌入式”替换。该接口当前在大型应用程序中使用。
库的作者现在不赞成使用旧的COM接口,他们现在仅支持和开发C#接口。
我的任务是开发上述“嵌入式”替换。它充当旧应用程序(用Delphi编写)和新的基于C#的接口之间的代理。我试图在主应用程序中尽可能少地更改代码。因此,我尝试尽可能地模仿旧界面。
所以我用C#编写代码,然后将其导出到TLB文件中。 TLB文件用于使用“ TLIBIMP.EXE -P”命令生成Delphi副本。

这是使用旧界面生成的代码。如您所见,有一个属性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#副本,该副本会生成其中带有Cat [index]属性的TLB文件。

所以到目前为止,我的解决方案是:
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;

到目前为止,一切都很好。但是该属性被命名为“ Item”,而不是原始的“ Cat”。有人暗示我该如何实现吗?

参考方案

Item是C#索引器的默认名称。

第一种可能性是在生成的Delphi代码中将Item重命名为Cat

第二种可能性是指定C#索引器名称:

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

向COM对象传递流或从COM对象返回流 - php

也许我正在尝试做的事情是不可能的,或者如此简单,以至于在任何地方都没有(我能找到)写过任何东西。总的来说,我试图确定如何(如果可能)将流传递到COM对象或从COM对象返回流。具体来说,我的COM对象是用Delphi编写的,通常将由PHP脚本使用。一个用例是将一大堆二进制数据作为流从COM对象通过PHP返回到Web客户端。或将从Web客户端接收到的大量二进制数…

LeetCode题解计算机为什么是基于二进制的?

可以是三进制么?二进制有什么好处?题解:为什么叫电子计算机?算盘应该没有二进制

LeetCode题解统计城市的所有灯泡

这个是我刚毕业的时候,一个真实的面试题,这是一个开放题。题目描述:想办法,将一个城市的所有灯泡数量统计出来。题解:费米估算法1、如果某个城市常驻人口有1000万2、假设每5人居住在一套房里,每套房有灯泡5只,那么住宅灯泡共有1000万只3、假设公众场所每10人共享一只灯泡,那么共有100万只4、主要的这两者相加就得出了1100万只当然实际上这是估算的,具体应…

LeetCode题解黑白圆盘

一个圆盘被涂上了黑白二色,两种颜色各占一个半圆。圆盘以一个未知的速度、按一个未知的方向旋转。你有一种特殊的相机可以让你即时观察到圆上的一个点的颜色。你需要多少个相机才能确定圆盘旋转的方向?题解:可以用一个相机即可

LeetCode题解圆上任取三点构成锐角三角形的概率

来自字节跳动的一道几何题题解:1/4