2012-08-27 25 views
6

Estoy tratando de pasar la matriz .NET a la biblioteca COM VB6. Tengo un objeto que es contenedor COM del objeto VB6. Tiene método con la siguiente firma:Pasando la matriz C# de objetos COM a VB6

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

pero cuando lo llamo me sale un ArgumentException con el siguiente mensaje:

Valor no está dentro del rango esperado.

El tipo de excepción y su descripción ni siquiera dependen del elemento pasado.

¿Alguien sabe cómo evitar este problema?

UPD: Eliminé los ensamblados de empaquetamiento .NET y las bibliotecas fuente .COM referidas. No hubo cambios

+3

El atributo [MarshalAs] es claramente erróneo. –

+0

De acuerdo. @ user1453239 ¿Por qué crees que era una estructura? – tcarvin

+0

Esta declaratioin es de la biblioteca que estoy tratando de usar. Es proporcionado por un desarrollador externo. –

Respuesta

0

que tendría que reflejar el formato de VB6 estructura:

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

Para importar la función que tendría que hacer :

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

Puede realizar fácilmente las siguientes funciones para realizar struct < -> Conversiones de IntPtr:

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

Editar: He leído mal lo que quería hacer. Pero esto es un comienzo para hacer la interoperabilidad.

La excepción de argumento proviene de intentar enviar un tipo de referencia como un tipo de valor. (Objeto es una clase, estructuras se manejan de forma diferente)

Si desea pasar una matriz puede hacer:

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

Creo que se podría escribir la declaración de un método externo como el siguiente:

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

//or like the following: 

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