2010-04-15 16 views
5

Tengo una biblioteca COM de terceros que estoy consumiendo y tengo problemas con los parámetros de la matriz.Uso de los parámetros Ref Array en C# con interoperabilidad COM

La firma del método que estoy llamando es el 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 consigue de llamados, todos de los valores en la matriz son solo valores predeterminados (son estructuras) aunque el método devuelva un valor de retorno distinto de cero.

Sé que hay algunas cosas funky COM de interoperabilidad aquí, pero realmente no tengo mucha experiencia 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 manejar un valor de retorno. La solución específica de este artículo no funciona, pero siento que me estoy calentando.

Respuesta

0

Ha pasado un tiempo desde que hice Interop, así que no estoy seguro, pero creo que debería asignar memoria no administrada para enviarla a la biblioteca COM. Me gustaría ver la clase Marshal, especialmente Marshal.AllocHGlobal (probablemente tenga que usar FreeHGlobal para liberar la memoria hacia atrás).

Algo como esto quizá:

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