簡體   English   中英

使用com-interop將數組從vba傳遞給c#

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM