从C#创建COM索引属性?

时间:2011-05-06 15:06:28

标签: c# .net vb6 com-interop

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

但我很好奇。在VB6中,它在对象库中具有以下内容:

Property BankList(Index As Long) As String

但AFAIK属性不能在.net中完成吗?

我能得到的最接近的是创建一个展示该行为的函数,然后COM类型从Property转到Method。

有人可以建议我如何使用属性创建该签名吗?

4 个答案:

答案 0 :(得分:4)

您可以使用indexer属性来装饰常规IndexerNameAttribute,以便将其名称公开给其他语言。不过,我不确定这是否会实现你的目标。

不幸的是,C#只支持调用命名索引器作为COM互操作的一部分,没有支持的语言实现方式(即,一个类只能default indexer IndexerNameAttribute属性)。

您可以通过实现带有索引器的类型然后具有该类型的属性来创建与C#调用者类似的内容,但它不会精确映射到您需要的VB6等效项。

另请参阅:Using Indexers (C#)

<强>除了
正如其他答案中所提到的,虽然C#不支持命名索引器,但.NET CLR和其他一些语言(如VB.NET)也可以。您可能需要考虑更改目标语言才能获得此功能。

答案 1 :(得分:2)

根据http://blogs.msdn.com/b/kirillosenkov/archive/2009/10/20/indexed-properties-in-c-4-0.aspx,您无法在C#中声明索引属性。但是,与其他一些答案所述的情况相反,CLR 支持它们,您可以在VB.NET中声明它们。

答案 2 :(得分:2)

无法在C#中创建命名的参数化属性(只有一个默认值,名为this可用)。

有很多选择:

  • 更改界面(但由于客户端代码需要更改,因此错过了这一点。)
  • 使用VB(.net),它可以创建这样的属性。
  • 使用C ++创建适配器以在COM级别提供完全控制。

第一个意味着更改界面,这会破坏您的要求。最后一个选项提供了最多的控制权,但是要复杂得多(除非你已经知道C ++ COM开发)。我会选择VB.NET。

答案 3 :(得分:1)

.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-properties-in-c-4-0.aspx

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