【问题标题】:Exporting multiple indexed attributes from C# to tlb --> delphi将多个索引属性从 C# 导出到 tlb --> delphi
【发布时间】:2020-08-05 18:44:30
【问题描述】:

我目前正在尝试重新实现一个 com 接口。 这个接口目前在一个Delphi项目中使用。 Delphi 接口代码大概是使用“TLIBIP.EXE -P”机器生成的) 在这个自动生成的代码中有例如这个接口:

IDPets = interface(IDispatch)
    ['{679DDC30-232F-11D3-B461-00A024BEC59F}']
    function Get_Value(Index: Integer): Double; safecall;
    procedure Set_Value(Index: Integer; Value: Double); safecall;
    function Get_Pet(Index: Integer): IDPets; safecall;
    procedure Set_Pet(Index: Integer; const Ptn: IDPets); safecall; 
    property Value[Index: Integer]: Double read Get_Value write Set_Value;
    property Pet[Index: Integer]: IDPets read Get_Pet write Set_Pet;
end;

如您所见,有多个属性可以像使用方括号的字段或数组一样访问。

到目前为止我取得了什么成就:

在 C# 中,可以使用此代码编写一个索引器访问器

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

(来自:How do I export an interface written in C# to achieve Delphi code generated by TLB

问题:

但是现在我需要在一个类中拥有多个索引器。而且它们只是返回类型不同,所以我不能简单地重载“this”关键字。

那么有谁知道我如何在 C# 中实现它,以便我得到一个 TLB 文件,该文件可用于生成您可以在本文顶部看到的 Delphi 代码?

非常感谢任何想法。

编辑:我已经偶然发现了这篇文章https://stackoverflow.com/a/4730299/3861861 它有点工作,所以我能够将多个带有索引的属性导出到 Delphi。但是这个属性的类型不是正确的。例如:double 不是 double 它是 IIndexerDouble(我需要从索引器中删除泛型以进行 com 导出,因此我必须为我想要使用的每种数据类型编写一个索引器)

【问题讨论】:

    标签: c# delphi com tlb


    【解决方案1】:

    您不需要“在一个类中拥有多个索引器”。你真正需要的是在 Delphi 中有几个索引属性。

    假设您要添加 Dog 索引属性。首先将这些常规方法添加到 C# 类中:

    public Dog GetDog(int index)
    {
        ...
    }
    
    public void SetDog(int index, Dog value)
    {
        ...
    }
    

    他们会生成这个:

    function GetDog(Index: Integer): IDDogs; safecall;
    procedure SetDog(Index: Integer; const Ptn: IDDogs); safecall; 
    

    现在只需添加索引属性的声明:

    property Dog[Index: Integer]: IDDogs read GetDog write SetDog;
    

    【讨论】:

    • 这是一种可行的方法。但这需要在界面的每次迭代中执行更多手动步骤。我正在寻找一种解决方案,在 .pas 文件由 tlbimp.exe 生成后,我不需要对其进行操作。原始代码 pas 文件看起来也是完全自动生成的,无需人工干预。
    • 原来的 COM 组件不是用 C# 编写的。您可以尝试将方法命名为get_Dog()set_Dog(),如果幸运的话,tlibimp.exe 会将它们解释为索引属性。如果没有,那么您没有解决方案(除了手动编辑)。
    • 遗憾的是,这不起作用,所以我认为除了在生成 .pas 文件后对其进行修补之外,没有其他解决方案。我也试过这个解决方案:stackoverflow.com/a/23081403/3861861 但它也不起作用。类实现的第一个接口在 TLB 文件中获得 [default] 标签。并且 tlbimp.exe 完全忽略了第二个界面。
    • 好的,我现在写了一个 Patcher 应用程序。它解析 pas 文件并生成匹配 setter 和 getter 函数的属性等。感谢您的帮助。
    猜你喜欢
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    相关资源
    最近更新 更多