2012-08-27 68 views
6

我試圖將.NET數組傳遞給COM VB6庫。我有一個對象,它是VB6對象的COM包裝器。它有方法具有以下簽名:將COM對象的C#數組傳遞給VB6

[MethodImpl(MethodImplOptions.InternalCall, 
    MethodCodeType = MethodCodeType.Runtime)] 
void AddEx([MarshalAs(UnmanagedType.Struct)] object vSafeArrayOfItems); 

,但是當我把它叫做我得到以下消息的ArgumentException

值不在預期的範圍內。

異常的類型及其描述甚至不依賴於傳入的元素。

有沒有人知道如何解決這個問題?

UPD:我刪除了.NET包裝程序集和引用的源.COM庫。沒有發生變化。

+3

的[的MarshalAs]屬性顯然是錯誤的。 –

+0

同意。 @ user1453239你爲什麼認爲這是一個結構? – tcarvin

+0

這個聲明來自我正在嘗試使用的庫。它由第三方開發人員提供。 –

回答

0

您將需要反映VB6結構格式:

[StructLayout(LayoutKind.Sequential)] 
public struct myStruct { 
    type1 member1; 
    type2 member2; 
} 

要導入你會做功能:

[DllImport("dllname.dll")] 
public static extern void AddEx(IntPtr paramName); 

您可以輕鬆使用以下功能來執行結構< - > IntPtr轉換:

myStruct struct = Marshal.PtrToStructure(paramName, typeof(myStruct)); 
// do stuff 
Marshal.StructureToPtr(struct, paramName, false); 

編輯:我誤解了你想做的事。但這是做互操作的首發。

參數異常來自嘗試發送引用類型作爲值類型。 (對象是類,結構處理方式不同)

如果你想傳遞一個數組,你會怎麼做:

void AddEx([MarshalAs(UnmanagedType.LPArray)] ref myStruct[] param); 
0

我想你可以寫這樣的外部方法聲明如下:

[DllImport... 
public static extern void AddEx(YourType[] paramName); 

//or like the following: 

public static extern unsafe void AddEx(YourType * paramName);