Excel get_Range mancanti quando assembly di interoperabilità è incorporato .NET 4.0

Ho deciso di costruire un riferimento a un assembly di interoperabilità COM DLL. Se incorporare i tipi di interoperabilità COM impostando Incorporare Tipi di Interoperabilità di Vero in Riferimento proprietà (VS2010), in fase di esecuzione si verifica un errore “oggetto non contiene una definizione per get_Range”. Se tipi di interoperabilità COM non sono criptate quindi non si verifica alcun errore.

Qualcuno sa perché e con un particolare metodo di Foglio di lavoro.get_Range dovrebbe essere omesso o come risolvere questo o per altri approfondimenti pertinenti? Dovrei essere grato per qualsiasi aiuto.

Interop dll contiene un riferimento al Foglio di lavoro.get_Range(oggetto, [object]). Usando il riflettore su mia chiamata assemblea non vi è alcuna menzione di get_Range sotto il Foglio di lavoro.

L’assembly di interoperabilità io sono l’incorporamento è generato da Excel9.olb. Io non sto usando Pia come l’applicazione di obiettivi più versioni di Excel.

InformationsquelleAutor mikemay | 2010-02-03



2 Replies
  1. 10

    Non ho provato questo fuori di me ancora, ma credo che la sintassi è cambiato quando si utilizza embedded tipi di Interoperabilità COM in C# 4.0 in più C# amichevole di sintassi”.

    Quindi, invece di cercare il get_Range(object, [object]) metodo, è possibile omettere il parametro opzionale (invece di dover fornire Type.Missing), o si può evitare di chiamare la funzione di accesso get completamente, e invece riferimento il nome della proprietà, utilizzando le 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 “vecchia maniera”, in cui il nuovo indicizzatore sintassi è davvero chiedendo il necessario ‘avere’ e ‘set’ funzione di accesso dietro le quinte, così io non so davvero perché si hanno problemi. La mia ipotesi è che avete bisogno di guardare sotto Worksheet.Range invece di Worksheet.get_Range nell’IntelliSense elenco. Se questo non funziona per voi, allora suona come qualcosa potrebbe essere sbagliato con la vostra installazione.

    Per saperne di più, vedere: Proprietà indicizzate in C# 4.0 da Kirill Osenkov.

    Spero che questo aiuta…

    Mike

    • MIke, grazie per il vostro aiuto. L’unico parametro approccio non consente di ottenere un errore di run-time e non è ovviamente una buona soluzione. Ho inviato una segnalazione a Microsoft 530769.
    • connect.microsoft.com/VisualStudio/feedback/details/530769/…
    • Ah, giusto, ho postato male il link nel mio precedente commento, grazie per la correzione. La discussione è molto interessante, e di senso. Ma, chiedo, non è la soluzione più semplice per ora è sufficiente utilizzare il worksheet.Range["A1"] sintassi al posto del vecchio worksheet.get_Range("A1", Type.Missing) ora che si sta utilizzando C# 4.0? Avete trovato un interessante curiosità, ma come per il fissaggio il proprio codice, sembrerebbe più facile e migliore per utilizzare solo la nuova sintassi — che è più facile da leggere in qualsiasi caso (con il design!).
    • Mike, io sono d’accordo che c’è stato un evidente soluzione non appena ho provato il tuo metodo suggerito e ho da tempo adottato una variante. Continua la discussione è strettamente per aiutare gli sforzi di Microsoft per rendere la compatibilità all’indietro possibile (ed è un risultato impressionante). Su un punto di dettaglio, non posso dire che preferisco il “A1″ approccio ” o anche “R1C1”. Non ho particolarmente voglia di convertire numeri in stringhe solo per effettuare la chiamata (e per quanto ne so Excel converte la schiena diritta). Forse è una questione di taate. Grazie per il vostro continuo interesse.
    • Ok, no, non stavo suggerendo di fare effettivamente utilizzare la stringa “A1” per designare la cella. Stavo semplicemente dicendo che, l’utilizzo di C# 4.0, si può, e dovrebbe, fare uso di un foglio di lavoro.Gamma[oggetto] sintassi invece del foglio di lavoro.get_Range(oggetto, oggetto) sintassi. Questo è tutto. È più semplice, più pulito, e funziona, come originariamente previsto, utilizzando la proprietà del nome (“Range”) invece di esporre la funzione di accesso get (“get_Range”). Ma ho potuto vedere dove questo potrebbe essere un grosso problema se si tenta di eseguire la migrazione di un sacco di codice in C# 3.0 di C# 4.0. Una smart Regex sostituzione potrebbe farlo-ma assicuratevi di avere il test di unità!
    • Siamo sulla stessa pagina!

Lascia un commento