2010-02-03 7 views
7

I build un assembly che fa riferimento a una DLL di interoperabilità COM. Se incorporo i tipi di interoperabilità COM impostando Incorpora tipi di intervallo su Vero nelle proprietà del riferimento (VS2010), in fase di esecuzione si verifica un errore "l'oggetto non contiene una definizione per get_Range". Se i tipi di interoperabilità COM non sono incorporati, non si verifica alcun errore.Excel get_Range mancante quando l'assembly di interoperabilità è incorporato in .NET 4.0

Qualcuno sa perché un metodo particolare, Worksheet.get_Range dovrebbe essere omesso o come aggirare questo o avere altri approfondimenti rilevanti? Dovrei essere grato per qualsiasi aiuto.

La DLL di interoperabilità contiene un riferimento a Worksheet.get_Range (oggetto, [oggetto]). Usando il reflector sul mio assembly chiamante non si fa menzione di get_Range sotto Worksheet.

L'assembly di interoperabilità che sto incorporando è generato da Excel9.olb. Non sto utilizzando le PIA poiché l'applicazione ha come target più versioni di Excel.

risposta

10

Non l'ho ancora provato, ma credo che la sintassi sia cambiata quando si utilizzano i tipi di interoperabilità COM incorporati in C# 4.0 con una sintassi più "C# friendly".

Pertanto, anziché cercare il metodo get_Range(object, [object]), è possibile omettere il parametro facoltativo (invece di dover fornire Type.Missing), oppure è possibile evitare di chiamare completamente l'accessorio get e fare invece riferimento al nome della proprietà utilizzando parentesi quadre:

// Using C# 3.0: 
Excel.Range range = worksheet.get_Range("A1", Type.Missing); 

// Using C# 4.0, omitting the optional parameter: 
Excel.Range range = worksheet.get_Range("A1"); 

// Using C# 4.0, utilizing square-bracket indexing: 
Excel.Range range = worksheet.Range["A1"]; 

da quello che ho capito, però, si dovrebbe comunque essere in grado di chiamare la "vecchia maniera", dove la nuova sintassi indicizzatore è davvero chiamando il 'get' e di accesso richiesto 'set' dietro le quinte, quindi non so davvero perché stai avendo problemi. La mia ipotesi è che è necessario guardare sotto Worksheet.Range invece di Worksheet.get_Range all'interno della lista IntelliSense. Se questo non funziona per te, allora sembra che qualcosa potrebbe essere sbagliato con il tuo setup o installazione.

Per ulteriori informazioni, vedere: Indexed Properties in C# 4.0 di Kirill Osenkov.

Spero che questo aiuti ...

Mike

+0

MIke, grazie per il vostro aiuto. L'approccio a parametro singolo non ottiene un errore di run-time ed è ovviamente una buona soluzione. Ho inviato una segnalazione di bug a Microsoft 530769. – mikemay

+1

https://connect.microsoft.com/VisualStudio/feedback/details/530769/get-range-method-missing-with-embedded-interop-assembly?wa=wsignin1.0 – mikemay

+0

Ah, giusto, ho postato un link errato nel mio commento precedente, grazie per averlo corretto. La discussione è molto interessante e ha un senso. Ma, posso chiederlo, non è la soluzione più semplice per usare semplicemente la sintassi 'worksheet.Range [" A1 "]' invece del più vecchio 'worksheet.get_Range (" A1 ", Type.Missing)" ora che sei usando C# 4.0? Hai trovato una curiosità molto interessante, ma per quanto riguarda il fissaggio per il tuo codice, sembrerebbe più semplice e meglio usare semplicemente la nuova sintassi - che è più facile da leggere in ogni caso (in base alla progettazione!). –

Problemi correlati