2012-08-27 10 views
6

Ich versuche, .NET-Array zu COM VB6-Bibliothek zu übergeben. Ich habe ein Objekt, das COM-Wrapper von VB6-Objekt ist. Es hat Methode mit folgenden Signatur:Weitergabe von C# -Array von COM-Objekten an VB6

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

aber wenn ich es nenne ich ein ArgumentException mit der folgenden Meldung:

Wert nicht innerhalb des erwarteten Bereichs fällt.

Der Typ der Ausnahme und ihre Beschreibung hängt nicht einmal von übergebenen Element ab.

Weiß jemand, wie man dieses Problem umgehen kann?

UPD: Ich habe .NET-Wrapper-Assemblys und referenzierte .COM-Quellbibliotheken entfernt. Keine Änderungen waren passiert.

+3

Das [MarshalAs] Attribut ist eindeutig falsch. –

+0

Einverstanden. @ user1453239 Warum hast du gedacht, es war eine Struktur? – tcarvin

+0

Diese Deklaration stammt aus der Bibliothek, die ich verwenden möchte. Es wird von Drittentwicklern bereitgestellt. –

Antwort

0

Sie müssten die VB6 struct Format spiegeln:

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

die Funktion zu importieren, die Sie tun müssten :

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

Sie können ganz einfach die folgenden Funktionen verwenden structauszuführen-> IntPtr Konvertierungen:

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

Edit: Ich falsch gelesen, was Sie tun wollten. Aber das ist ein Starter für die Interop.

Die Argumentausnahme kommt vom Versuch, einen Referenztyp als Werttyp zu senden. (Objekt ist eine Klasse, werden structs unterschiedlich gehandhabt)

Wenn Sie ein Array übergeben möchten Sie tun würde:

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

Ich denke, man könnte die externe Methode Erklärung wie das schreiben folgendes:

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

//or like the following: 

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