У меня есть проект библиотеки классов C# (.Net Framework 4.5), который я использую в VB6 в качестве библиотеки типов (.tlb).
Все отлично работает со свойствами с объектами не из коллекции в качестве атрибутов или возвращаемых значений.
Насколько я знаю, невозможно предоставить коллекцию (массив/список) объекта пользовательского типа, например Product [], в проекте C# и экспортируйте ее в файл tlb, но Object [], как я слышал, это нормально. Итак, я поменял:
Код: Выделить всё
Public List
ListOfProducts( get; set; )
Код: Выделить всё
Object [] _productList;
public Object [] ListOfProducts
{
get
{
return _productList;
}
set
{
_productList = value;
}
}
Код: Выделить всё
public void SetListOfProducts(Object [] products)
{
_productList= products;
}
Код: Выделить всё
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
Код: Выделить всё
[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;
}
}
Код: Выделить всё
[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-interop. >
[*]Библиотека взаимодействия C# COM
[*]C# COM Interop: как создать метод, который принимает параметр массива по значению?
[*] Каковы альтернативы универсальным коллекциям для COM Interop?
[*]Маршалинг SAFEARRAY управляемых структур с помощью COM Interop
[*]WCF COM Interop со сложными типами
Com Interop (передача массива из C#)
[*]Рекомендации по экспорту List в C# для COM Interop
Тем не менее, есть ли способ получить и установить массив объектов (предпочтительно тип массива продуктов) из C# в COM, даже используя .Net 5+?
Спасибо всем!
Подробнее здесь: https://stackoverflow.com/questions/743 ... pe-library
Мобильная версия