You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过C#类型库(COM互操作)实现对象数组属性/方法赋值?

C# COM互操作:VB6中传递自定义对象数组的问题

问题背景

我有一个.NET Framework 4.5的C#类库项目,作为类型库(.tlb)在VB6中使用。非集合类型对象的属性作为参数或返回值时一切正常。

我了解到无法在C#项目中直接暴露用户自定义类型(如Product[])的集合(数组/列表)并导出到tlb文件,但Object[]理论上可行。于是我把原本的代码:

Public List<Product> ListOfProducts { get; set; }

修改为:

Object [] _productList;
public Object [] ListOfProducts
{
    get
    {
        return _productList;
    }
    set
    {
        _productList = value;
    }
}

还尝试添加了一个方法:

public void SetListOfProducts(Object [] products)
{
    _productList= products;
}

修改后,ListOfProducts和SetListOfProducts在VB6项目中可见,但运行VB6代码时抛出错误:

Private Sub Command1_Click()
    Dim Sell as new SellProducts
    Dim prodct(1) As New TlbProj.Product 'Product是tlb中的类
    prodct(0).EAN = "7894900011517"
    prodct(1).EAN = "7894900017011"
    
    Dim prodctVariant(1) As Variant
    'Set prodctVariant = prodct或prodctVariant = prodct会抛出"无法分配给数组"错误
    prodctVariant(0) = prodct(0)  '逐个赋值是我唯一能实现的方式,这不是主要问题
    prodctVariant(1) = prodct(1)

    Sell.ListOfProducts = prodctVariant
    '对象浏览器显示:'Property ListOfProducts As Variant()
    '抛出错误:"函数或接口被标记为受限,或函数使用了Visual Basic不支持的自动化类型"

    Sell.SetListOfProducts prodctVariant
    '对象浏览器显示:'Sub SetListOfProducts(products() As Variant)
    '抛出错误:"函数或接口被标记为受限,或函数使用了Visual Basic不支持的自动化类型"

End Sub

类定义

SellProducts类

[ClassInterface(ClassInterfaceType.AutoDual)]
[Guid("757E6144-FC46-44A0-89DB-B89EF8F75BAB")]
[ProgId("TlbProj.SellProducts")]
[ComVisible(true)]
public class SellProducts
{
  Object [] _productList;
  public Object [] ListOfProducts
  {
      get
      {
          return _productList;
      }
      set
      {
          _productList = value;
      }
  }

  public void SetListOfProducts(Object [] products)
  {
      _productList= products;
  }
}

Product类

[ClassInterface(ClassInterfaceType.AutoDual)]
[Guid("A4292449-4459-42D4-8FB0-18AA0D5FF34A")]
[ProgId("TlbProj.Product")]
[ComVisible(true)] 
public class Product
{
    public string EAN { get; set; }
}

已尝试方案

  • 尝试通过VBA向C#传递数组的COM互操作方案
  • C# COM互操作库相关方案
  • 实现按值接收数组参数的COM互操作方法方案
  • 通用集合的COM互操作替代方案
  • 托管结构体的SAFEARRAY编组方案
  • 复杂类型的WCF COM互操作方案
  • C#向COM传递数组的方案
  • 导出List<Class>到COM的最佳实践方案

以上方案均未解决问题。

需求

是否存在一种方法可以在C#与COM之间实现对象数组(优先为Product类型数组)的读写?支持.NET 5+也可。


内容的提问来源于stack exchange,提问作者Diego Sayron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 21:21:02