如何导出C#写的接口实现TLB生成的Delphi代码
How do I export an interface written in C# to achieve Delphi code generated by TLB
我目前正在开发 "drop-in" 旧 COM 接口(用于与其他设备通信)的替代品。这个接口目前在一个大的应用中使用。
旧的 COM 接口现在已被库的作者弃用,他们现在只支持和开发 C# 接口。
我的任务是开发上面提到的 "drop-in" 的替代品。它充当旧应用程序(用 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; }
我目前正在开发 "drop-in" 旧 COM 接口(用于与其他设备通信)的替代品。这个接口目前在一个大的应用中使用。 旧的 COM 接口现在已被库的作者弃用,他们现在只支持和开发 C# 接口。 我的任务是开发上面提到的 "drop-in" 的替代品。它充当旧应用程序(用 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; }