使用com-interop将用户定义的类数组从vba传递到.net(特别是c#)的正确方法是什么?
这是我的c#代码。如果我从vba调用Method1,它将失败“预期的数组或用户定义类型”或“函数使用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)
答案 0 :(得分:4)
IIRC你必须通过引用传递数组。
尝试将您的方法声明为
public class MyClass
{
public void Method1([In] ref UserDefinedClass[] Parameters) { ... }
...
}
如果您不想使用.NET客户端的ref参数污染您的类,您可以定义COM客户端使用的ComVisible接口,并明确地实现它:
[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代码能够调用的任何其他方法(例如,添加,删除,插入,清除......) 。例如。
[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