[英]Pass an array from vba to c# using com-interop
使用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)
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.