Свойство String Array в классе COM и установить его из VBA

Я недавно работаю с одним требованием библиотеки типов. Я создал класс aC#, который будет открыт для компонента COM. Однако, когда я устанавливаю значение в свойство массива, я получаю ошибку компилятора. Весь код размещен здесь.

Ждем ваших экспертных комментариев!

(VBA) Ошибка компиляции:
Функция или интерфейс помечены как ограниченные, либо функция использует тип автоматизации, не поддерживаемый в Visual Basic

C# Com Class

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(_LeafletTestClass))]
[ProgId("Leaflet.WebService.Toolkit.LeafletWS.LeafletTestClass")]
[Guid("364C5E66-4412-48E3-8BD8-7B2BF09E8922")]
public class LeafletTestClass : _LeafletTestClass
{
    [ComVisible(true)]
    public string[] TestArrayString
    {
        [return: MarshalAs(UnmanagedType.SafeArray)]
        get;
        [param: MarshalAs(UnmanagedType.SafeArray)]
        set;
    }

}

[ComVisible(true)]
[Guid("8C034F6A-1D3F-4DB8-BC99-B73873D8C297")]
public interface _LeafletTestClass
{
    [ComVisible(true)]
    string[] TestArrayString
    {
        get;
        set;
    }
}

VBA Создать объект

Sub test()

Dim testClass As LeafletTestClass
Set testClass = New LeafletTestClass
Dim arr(0 To 1) As String
arr(0) = "Test value"
testClass.TestArrayString = arr

End Sub

1 ответ

Я бы порекомендовал вам избегать использования массивов. Пока вы можете использовать Marshal и, возможно, маршал через него чреват проблемами из-за различий в обработке пустых массивов и нулей и т. д. и т. д.

Чтобы избежать ошибок во время выполнения, лучше написать класс коллекции и выполнить маршалинг, чтобы VBA могла просто перечислять. Пример этого см. Здесь

Как минимум, интерфейс вашей коллекции должен выглядеть так:

[
    ComVisible(true),
    Guid(<some guid>),
    InterfaceType(ComInterfaceType.InterfaceIsDual)
]
public interface IDeclarations : IEnumerable
{
    [DispId(0)]
    Declaration Item(int Index);

    [DispId(1)]
    int Count { get; }

    [DispId(-4)]
    IEnumerator _GetEnumerator();
 }
Другие вопросы по тегам