2012-08-27 14 views
6

Próbuję przekazać bibliotekę .NET do biblioteki COM VB6. Mam obiekt, który jest opakowaniem COM obiektu VB6. Ma metodę z następującym podpisem:Przekazywanie tablicy C# obiektów COM do VB6

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

ale gdy zgłoszę go dostaję ArgumentException z następującym komunikatem:

wartość nie mieści się w oczekiwanym zakresie.

Typ wyjątku i jego opis nie zależy nawet od przekazanego elementu.

Czy ktoś wie, jak obejść ten problem?

UPD: Usunąłem zespoły opakowania .NET i odsyłane źródłowe biblioteki .COM. Nie nastąpiły żadne zmiany.

+3

Sieć [MarshalAs] atrybutem jest oczywiście błędne. –

+0

Uzgodnione. @ user1453239 dlaczego uważasz, że to była struktura? – tcarvin

+0

Ta deklaracja pochodzi z biblioteki, której próbuję użyć. Jest on dostarczany przez niezależnego programistę. –

Odpowiedz

0

Trzeba by odzwierciedlić format VB6 struct:

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

do importowania funkcji trzeba by zrobić :

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

Z łatwością można użyć następujących funkcji do wykonania struct < -> Konwersje IntPtr:

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

Edytuj: błędnie przeczytałem, co chciałeś zrobić. Ale to jest początek dla robienia interopu.

Wyjątek argumentu pochodzi z próby wysłania typu odwołania jako typu wartości. (Obiekt jest klasy, struktury są traktowane inaczej)

Jeśli chcesz przekazać tablicę byłoby zrobić:

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

Myślę, że można napisać oświadczenie zewnętrznego metody jak następuje:

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

//or like the following: 

public static extern unsafe void AddEx(YourType * paramName); 
Powiązane problemy