2010-12-27 6 views
10

Hago C# excel interoperabilidad. Llamo a macros desde C#, y espero arreglos de objetos. Puedo obtener matrices bidimensionales de objetos de las macros que devuelven matrices bidimensionales.¿Qué es este tipo `Object [*]` que obtengo con la interoperabilidad COM?

Sin embargo, se supone que otra macro (de terceros) devuelve una matriz unidimensional. No puedo obtener el (object[])xlApp.Run(...) funcionando (arroja una excepción), y la información de tipo en el depurador dice que el resultado es del tipo Object[*]. El mensaje real de la excepción es

Unable to cast object of type 'System.Object[*]' to type 'System.Object[]'. 

¿Cuál es este tipo Object[*] y no cómo recuperar una matriz unidimensional de esto?

EDIT: Se me ocurrió que esto podría significar un SAFEARRAY de VARIANTES. Pero entonces, surgen dos preguntas: ¿por qué todo está bien con matrices bidimensionales? ¿Cómo convierto un SAFEARRAY en una matriz de C#?

Respuesta

9

I foulnd varios artículos acerca de su problema:

OPCFondation : Básicamente, en lugar de declarar como una matriz de objetos, puede declarar como una matriz sin proporcionar ningún tipo de elemento. Por lo tanto, no meta en Object [] sino en Array, y use un bucle foreach para usar el subcampo.

foreach(object subobject in (Array)myarrayitem) 
{ 
    //do stuff with the subobject, even browse further 
} 

Esta solución parece funcionar ya que se puede encontrar de nuevo here.

On StackOverflow: hablan de matrices con un límite inferior> 0, que le da el tipo de objeto [*], con algunos enlaces que pueden ser interesantes sobre el tema, pero creo que la primera idea es la buena.

0

Esto fue como un PITA. Tenía este código en dos proyectos:

Workbook wb = null; 
try 
{ 
    wb = excel.Workbooks.Open(filePath, false, true, 5, null, "WrongPAssword"); 
} 
catch 
{ 
    return false; 
}  

try 
{ 

    Array links = (Array)wb.LinkSources(XlLink.xlExcelLinks); 
    if (links != null) 
    { 

Uno funcionó y el otro no. La diferencia. Trabajando uno estaba apuntando a .Net 2.0 y otro era .Net 4.0 que estaba dando el error:

Unable to cast object of type 'System.Object[*]' to type 'System.Object[]'.

Resulta que si cambia la versión de Visual Studio de este artículo desde VS2005 a VS2010 los cambios LinkSources de tipo de datos.

MSDN Workbook.LinkSources Method

VS2010:

Object LinkSources(
    Object Type 
) 

VS2005:

public virtual Object LinkSources (
    [OptionalAttribute] Object Type 
) 
4

Uso

System.Array a = (System.Array)((object) returnedObject); 
Cuestiones relacionadas