首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用C#类型库- COM-Interop分配对象数组属性/方法?

如何使用C#类型库- COM-Interop分配对象数组属性/方法?
EN

Stack Overflow用户
提问于 2022-11-08 03:06:25
回答 1查看 58关注 0票数 5

我有一个C#类库项目(.Net Framework4.5),在VB6中使用它作为类型库(.tlb)。

non-collection对象作为属性或返回的属性可以很好地工作。

据我所知,不可能在Product []项目中公开用户类型对象(如C# )的集合(Array/List),并将其导出到tlb文件中,但我听说它是可以的。所以,我改变了:

代码语言:javascript
复制
Public List<Product> ListOfProducts( get; set; )

代码语言:javascript
复制
Object [] _productList;
public Object [] ListOfProducts
{
    get
    {
        return _productList;
    }
    set
    {
        _productList = value;
    }
}

我也试过:

代码语言:javascript
复制
public void SetListOfProducts(Object [] products)
{
    _productList= products;
}

完成后,ListOfProductsSetListOfProducts现在可以在Visual 6项目中看到,但在运行时在VB6中是可见的:

代码语言:javascript
复制
Private Sub Command1_Click()
    Dim Sell as new SellProducts
    Dim prodct(1) As New TlbProj.Product 'Product is a class inside of the tlb file
    prodct(0).EAN = "7894900011517"
    prodct(1).EAN = "7894900017011"
    
    Dim prodctVariant(1) As Variant
    'Set prodctVariant = prodct or prodctVariant = prodct  throws "Can't assign to array error"
    prodctVariant(0) = prodct(0)  'one by one was the only way I managed to do this. That's not the major problem.
    prodctVariant(1) = prodct(1)

    Sell.ListOfProducts = prodctVariant
    'The object browser shows: 'Property ListOfProducts As Variant()
    'it throws the message: "Function or interface marked as restricted, or the function uses an Automation type not supported in Visual Basic"

    Sell.SetListOfProducts prodctVariant
    'The object browser shows: 'Sub SetListOfProducts(products() As Variant)
    'it throws the message: "Function or interface marked as restricted, or the function uses an Automation type not supported in Visual Basic"

End Sub

我的类

代码语言:javascript
复制
[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;
  }
}
代码语言:javascript
复制
[ClassInterface(ClassInterfaceType.AutoDual)]
[Guid("A4292449-4459-42D4-8FB0-18AA0D5FF34A")]
[ProgId("TlbProj.Product")]
[ComVisible(true)] 
public class Product
{
    public string EAN { get; set; }
}

我尝试过,但没有成功:

也就是说,是否有一种方法可以从C#到COM,甚至使用.Net 5+来获取和设置对象数组(最好是产品类型的数组)?谢谢大家!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-08 11:25:57

尽管.NET创建了有效的类型库,但VB6并不支持它们。.NET泛型根本不能在边界上使用。

一种解决方案是将ArrayList用作C#和VB6中可用的集合类型,但它是非类型化的。它适用于.NET框架,但不确定它是否仍然有效(注册了?)和.NET Core3+。

下面是一个用于读取列表的解决方案,并且是为读取列表而键入的,但对于写操作则是非类型化的:

代码语言:javascript
复制
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
[Guid("757E6144-FC46-44A0-89DB-B89EF8F75BAB")]
[ProgId("TlbProj.SellProducts")]
public class SellProducts
{
    private readonly List<Product> _products = new List<Product>();

    public SellProducts()
    {
        _products.Add(new Product { EAN = ".NET1234" });
        _products.Add(new Product { EAN = ".NET5678" });
    }

    // read only mode
    public Product[] Products => _products.ToArray();

    // write mode, untyped :-(
    public void SetProducts(object products)
    {
        _products.Clear();
        if (products is IEnumerable enumerable)
        {
            _products.AddRange(enumerable.OfType<Product>());
        }
    }
}

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

VB6不理解用object[]Product[]参数为SetProducts创建的libs类型。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74355275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档