如何通过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
相关产品推荐
相关产品推荐

