retorna que pasar parametro multidimensionales metodos metodo matriz matrices llenar como bidimensionales arreglos arreglo array c# com interop com-interop

que - Usar los parámetros de Ref Array en C#con interoperabilidad COM



pasar un array como parametro c# (1)

Tengo una biblioteca COM de terceros que estoy consumiendo y tengo problemas con los parámetros de la matriz.

La firma de método que estoy llamando es la siguiente:

int GetItems(ref System.Array theArray)

La documentación dice que el valor de retorno del método es el número de elementos que se rellenará en la matriz, pero cuando se llama a get, todos los valores en la matriz son solo valores predeterminados (son estructuras) aunque el método arroja un resultado no valor de retorno cero.

Sé que hay algunas cosas de interoperabilidad COM funky aquí, pero realmente no tengo mucha experiencia con eso y no puedo entenderlo. Así es como he intentado acceder a él:

Array items = Array.CreateInstance(typeof(structItem), 100); int numberOfItems = instance.GetItems(items); Array items = Array.CreateInstance(typeof(structItem), 100); int numberOfItems = instance.GetItems(ref items); structItem[] items = new structItem[100]; int numberOfItems = instance.GetItems(items); structItem[] items = new structItem[100]; int numberOfItems = instance.GetItems(ref items);

¿Qué estoy haciendo mal?

ACTUALIZACIÓN: Creo que podría tener algo que ver con SafeArrays, como se describe aquí: http://www.west-wind.com/Weblog/posts/464427.aspx La diferencia es que se supone que debo pasar la matriz por ref, no solo maneja un valor de retorno. La solución específica de este artículo no funciona, pero siento que me estoy calentando.


Ha pasado un tiempo desde que hice Interop, así que no estoy seguro, pero creo que debería asignar memoria no administrada para enviar a la biblioteca COM. Me gustaría ver la clase Marshal , especialmente Marshal.AllocHGlobal (sin Marshal.AllocHGlobal es probable que tengas que usar FreeHGlobal para liberar la memoria).

Algo como esto tal vez:

IntPtr p = Marshal.AlloHGlobal(items.Length * Marshal.SizeOf(typeof(structItem)); Marshal.Copy(items, 0, p, items.Length);