2010-01-08 38 views
6

什麼是正確的方式來傳遞用戶定義的類從vba數組到.net(特別是C#)使用com-interop?從vba傳遞數組到c#使用com-interop

這是我的c#代碼。如果我從vba調用Method1,那麼它會失敗,並顯示「Array or userdefined type expected」或「Function uses an automatic type not visual in 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

我們會需要更多的信息在這裏。你可以添加類型的VBA定義和一些代碼來顯示調用COM接口嗎? – JaredPar 2010-01-08 13:24:56

+0

添加了vba代碼。 – Freddie 2010-01-08 21:02:00

+0

你的數組聲明聲明瞭一個變體數組 - 它應該聲明一個你的UserDefinedClass數組,例如「Dim myArray(0 To 3)As UserDefinedClass」 – Joe 2010-01-08 21:28:42

回答

4

IIRC按引用傳遞數組。

嘗試宣告你的方法

public class MyClass 
{ 
    public void Method1([In] ref UserDefinedClass[] Parameters) { ... } 
    ... 
} 

如果你不想污染與.NET客戶端ref參數類,你可以定義一個標記有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代碼的任何其他方法能夠打電話(例如,添加,重新移動,插入,清除...)。例如。

[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 
+0

我試過了,但我沒有明確嘗試添加'in'子句。我也會給你一個機會。使用'ref UserDefinedClass [] foo'導致了相同的錯誤,我很害怕。 – Freddie 2010-01-08 20:58:17

+0

所以,你說我不應該在'Parameters'參數中包含任何附加屬性。我見過使用MarshallAs的其他代碼,但正如我所提到的那樣,似乎在我的場景中不起作用。 – Freddie 2010-01-08 21:03:11

+0

「所以,你說...」 - 我知道你需要參考原始類型的數組參數。 [In]屬性會影響IDL的生成,因此不是必需的。我通常會使用集合類型將用戶定義的類傳遞給VBA(public class MyUserDefinedClassCollection:Collection ),所以我沒有真正嘗試過。 – Joe 2010-01-08 21:27:13