【问题标题】:Creating a COM indexed property from C#?从 C# 创建 COM 索引属性?
【发布时间】:2011-05-06 15:06:28
【问题描述】:

我正在尝试用新的 .net 模仿旧的 vb6 dll。模仿必须是完美的,这样调用者才不会知道他们正在使用一个新的 .dll。

不过我有点好奇。在 VB6 中,它在对象库中有以下内容:

Property BankList(Index As Long) As String

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

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

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

【问题讨论】:

  • 顺便说一句,没有 C#.NET 这样的东西。该语言被命名为“C#”。

标签: c# .net vb6 com-interop


【解决方案1】:

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

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

您可以通过使用索引器实现一个类型然后拥有该类型的属性来为 C# 调用者创建看起来相似的东西,但它并不完全映射到您需要的 VB6 等效项。

另见:Using Indexers (C#)

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      有多种选择:

      • 更改界面(但这没有抓住重点,因为客户端代码需要更改)。
      • 使用可以创建此类属性的 VB (.net)。
      • 在 C++ 中创建一个适配器以在 COM 级别提供完全控制。

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

      【讨论】:

      • 补充一点。如果你打算使用 C#,你可以在 C# 中创建你的 dll,使用它所具有的任何功能,然后在 vb 中编写一个小的“包装器”,它支持命名的参数化属性并只是通过调用 C# 代码。这样,您可以保持兼容性,但在 C# 中拥有所有新代码。就个人而言,我更喜欢 VB,所以我可能只在 VB 中做,但如果你(或团队)更喜欢 C#,那当然是一个选择。
      【解决方案4】:

      .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 将索引器公开为命名属性。

      【讨论】:

        猜你喜欢
        • 2016-07-10
        • 1970-01-01
        • 2011-03-10
        • 1970-01-01
        • 1970-01-01
        • 2010-12-12
        • 1970-01-01
        • 2019-12-15
        • 2012-03-13
        相关资源
        最近更新 更多