Что надлежащий путь состоит в том, чтобы передать массив определяемых пользователем классов от vba до .NET (конкретно c#) использующий com-interop?
Вот мой код c#. Если я называю Method1 от vba, он перестал работать с "Массивом или определяемым пользователем типом, ожидаемая" или "Функция использует тип автоматизации, не поддерживаемый в Visual Basic".
public class MyClass
{
public Method1(UserDefinedClass[] Parameters) { ... }
public Method2(Object Parameters) { ... }
}
Я читал немного о классе MarshallAsAttribute. Это могло быть недостающей частью в коде c#?
Вот код vba, который я использую:
Dim udt As New UserDefinedClass
Dim myArray()
myArray(1) = udt
myClass.Method1(myArray)
myClass.Method2(myArray)
IIRC вы должны передавать массивы по ссылке.
Попробуйте объявить свой метод
public class MyClass
{
public void Method1([In] ref UserDefinedClass[] Parameters) { ... }
...
}
Если вы не хотите загрязнять свой класс параметрами ref для .NET-клиентов, вы можете определить ComVisible интерфейс, который будет использоваться COM-клиентами, и реализовать его явно так:
[ComVisible(true)]
public interface IMyClass
{
void Method1([In] ref UserDefinedClass[] Parameters) { ... }
...
}
public class MyClass : IMyClass
{
void IMyClass.Method1(ref UserDefinedClass[] Parameters)
{
this.Method1(Parameters);
}
public Method1(UserDefinedClass[] Parameters)
{
...
}
}
** В ответ на комментарий ** Если вы хотите выставить коллекцию вместо массива на VBA, вам просто нужно выставить счетчик и любые другие методы, которые вы хотите, чтобы VBA-код мог вызывать (например, Add, Remove, Insert, Clear, ....). Например,
[ComVisible]
public interface IUserDefinedClassCollection
{
IEnumerator GetEnumerator();
int Count { get; };
IUserDefinedClass this[int index] { get; }
int Add(IUserDefinedClass item);
// etc, other methods like Remove, Clear, ...
}
Вы можете использовать его как обычно в VBA:
Dim objUserDefinedClasses As UserDefinedClassCollection
...
objUserDefinedClasses.Add objUserDefinedClass
...
For nIndex = 0 To objUserDefinedClasses.Count
Next nIndex