2011-01-26 10 views
5

In Excel è possibile restituire un array dinamico System.Object[*] da un oggetto serie utilizzando XValues. In .NET 3.5 è possibile accedere agli elementi in questo oggetto, gettandola da e array, vale a dire:Problemi di interoperabilità .NET 4.0 Excel con raccolte dinamiche

var values = (Array)series.XValues; 

In .NET 4.0, questo non funziona più, e il messaggio

"Impossibile cast oggetto di tipo 'System.Object [*]' per digitare 'System.Object []' "

dato.

Qualche idea? Quanto segue non funziona:

  • Lanciato come dinamico.
  • Trasmettendolo a System.Object[*].
  • Basta posizionare l'oggetto in a per ogni ciclo.
  • Cercando di accedere direttamente al valore utilizzando values[1], né quando lanciato come dinamico.

I valori all'interno dell'array appaiono tuttavia nel debugger.

risposta

5

Esistono due tipi distinti di matrici in .NET, un 'vettore' unidimensionale e matrici multidimensionali. Hai recuperato il secondo, un array multidimensionale con un punteggio di 1. Ciò si verifica se il codice non gestito ha restituito un SAFEARRAY il cui limite inferiore non è 0.

È possibile leggere il contenuto dell'array con Array. GetValue(). O convertirlo, in questo modo:

private static object[] ConvertArray(Array arr) { 
     int lb = arr.GetLowerBound(0); 
     var ret = new object[arr.GetUpperBound(0) - lb + 1]; 
     for (int ix = 0; ix < ret.Length; ++ix) { 
      ret[ix] = arr.GetValue(ix + lb); 
     } 
     return ret; 
    } 

prova:

var native = Array.CreateInstance(typeof(object), new int[] { 42 }, new int[] { 1 }); 
    var dotnet = ConvertArray(native); 

NOTA: si può avere un problema in .NET 4.0 e su quando alcune librerie dei tipi COM, Ufficio in particolare. La proprietà o il metodo può restituire una variante che contiene una matrice. Termina con dinamico nel programma C#. In questo caso, il compilatore C# non genera il corretto codice di binder. Lavorare intorno a ciò gettando prima a (oggetto), quindi a (matrice).

+0

Il problema che ho non è sempre il valore al di fuori di un oggetto Array la cui bassa-bound isnt 0, il problema sto avendo non riesco a convertire la raccolta di oggetti COM in qualcosa utilizzabile da .NET. Il codice di esempio che hai fornito implica l'utilizzo di un oggetto di tipo Array, ma non riesco a trasmettere la raccolta che mi è stata assegnata ad una matrice. Grazie per il tuo tempo tuttavia. –

+0

'Impossibile eseguire il cast dell'oggetto di tipo 'System.Object [*]'. Questa è una matrice. –

+0

@HansPassant la difficoltà è nel casting, vedere il collegamento nella mia risposta per i dettagli. – GreyCloud