从c#创建一个COM索引属性

本文关键字:一个 COM 索引 属性 创建 | 更新日期: 2023-09-27 17:55:02

我试图模仿一个新的。net一个旧的vb6 dll。模仿必须是完美的,以便调用者不知道他们正在使用新的。dll。

我有一种好奇心。在VB6中,它在对象库中有以下内容:

Property BankList(Index As Long) As String

但是AFAIK属性不能在。net中完成?

我能得到的最接近的是创建一个显示该行为的函数,但然后COM类型从属性到方法。

谁能建议我如何用属性创建签名?

从c#创建一个COM索引属性

您可以使用IndexerNameAttribute属性来装饰常规索引器,以便将其名称公开给其他语言。不过,我不确定这是否能达到你的目标。

不幸的是,c#只支持调用命名索引器作为COM互操作的一部分,没有支持的语言方式来实现你自己的(即,一个类只能有默认的索引器与IndexerNameAttribute属性)。

你可以为c#调用者创建一些类似的东西,通过实现带有索引器的类型,然后拥有该类型的属性,但它不能完全映射到你需要的VB6等效。

参见:Using Indexers (c#)

除了


正如在其他答案中提到的那样,虽然c#不支持命名索引器,但。net CLR和其他一些语言,如VB。网,做。为了获得此功能,您可能需要考虑更改目标语言。

根据http://blogs.msdn.com/b/kirillosenkov/archive/2009/10/20/indexed-properties-in-c-4-0.aspx,你不能在c#中声明索引属性。然而,与其他一些答案的状态相反,CLR 确实支持它们,并且您可以在VB.NET中声明它们。

命名参数化属性不能在c#中创建(只有一个默认的,称为this可用)。

有多个选项:

  • 更改接口(但这忽略了重点,因为客户端代码需要更改)。
  • 使用VB (.net),它可以创建这些属性。
  • 在c++中创建一个适配器,以在COM级别提供完全的控制。

第一种方法意味着改变接口,而这违背了您的要求。最后一个选项提供了最大的控制,但要复杂得多(除非您已经了解c++ COM开发)。我会选择VB.NET

索引属性在。net/c#中是可用的,但是你不能命名它们:

public String this[long index]
{
    get; set;
}

这将创建一个名为Item的属性,但在c#中不使用此名称:

myObj[1L];

如果你想在c# 4.0中调用COM中的命名属性,你可以:

excel.Range["a"];

http://blogs.msdn.com/b/kirillosenkov/archive/2009/10/20/indexed -属性- c - 4 - 0. - aspx

最后,如果您希望以COM语言命名索引,您可以使用IndexerNameAttribute将索引器作为命名属性公开。