Свойство 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();
}