Pourquoi est-ce à l'Aide de() me donne une erreur?
Je suis en train d'ouvrir une (des centaines en fait) fichier excel(s). J'ouvre l'application, mais que vous souhaitez utiliser à l'Aide de() les fonctionnalités autour de chacun des classeurs je l'ai ouvert. Pourquoi est-ce ce qui entraîne une erreur?
using (Excel.Workbook wbXL = appXL.Workbooks.Open(_sourceFullPath, Type.Missing, Excel.XlFileAccess.xlReadOnly))
{
//stuff with wbXL
}
utilisant obtient le trait de soulignement rouge et dit: "'Microsoft.Bureau de.Interop.excel.Classeur": Type utilisé dans une instruction d'utilisation doit être implicitement convertible Système.IDisposable'.
Façon de faire ce travail?
OriginalL'auteur Brad | 2011-08-25
Vous devez vous connecter pour publier un commentaire.
Assez bien ce qu'il dit - vous ne pouvez utiliser
using
avec des classes qui implémentent IDisposable, de sorte que sous les couvertures le compilateur sait quelle fonction appeler sur la finalisation -yourclass.Dispose()
. Excel interop classes ne pas l'implémenter.Donc, vous avez deux choix:
Écrire votre propre classe wrapper pour Excel.Classeur qui implémente IDispose et soit expose l'objet lui-même pour l'appel de méthodes, ou des enveloppements ces méthodes, par exemple
Mettre en œuvre
using
vous-même, par exemple,wbXL.Close(Excel.XlSaveAction.xlDoNotSaveChanges, workbookToClose);
quand je suis fait avec mon wbXL. Cela est suffisant pour la CG? À l'aide d'instruction ne serait pas un "mieux"?l'instruction à l'aide compile en un essayez-enfin de toute façon, donc c'est à peu près la même.
Ah ok et bien c'est pas aussi chic que je m'attendais à être. Cool! Merci beaucoup!
L'utilisation de la déclaration comprend un try-finally afin qu'il soit fermé, même en cas d'exception - je pense que c'est tout, je ne crois pas que les forces de GC n'. Si il y a une meilleure façon de nettoyer l'objet (par exemple, la force de libération de l'objet COM) quelque part dans le Système.Moment de l'exécution.Interop, alors vous pouvez appeler cela aussi, bien sûr, mais je n'en connais pas moi-même.
ok encore une chose! Maintenant j'ai accès à toutes ces choses (l'ouverture de la excel, de clôture, de l'interaction avec excel) à l'intérieur d'un csActiveFile classe. J'appelle ça de la classe et les méthodes à partir d'un formulaire. Est-ce que tu veux dire par classe wrapper?
OriginalL'auteur Rup
Tout élément dans une
using
déclaration doit mettre en œuvre lesIDisposable
interface. Je n'ai pas la documentation à portée de main, mais j'imagineExcel.Workbook
ne pas implémenter cette interface.OriginalL'auteur Adam Houldsworth
à l'aide de Déclaration (Référence C#):
Excel.Workbook
ne pas mettre en œuvreIDisposable
, de sorte que vous ne pouvez pas utiliserusing
pour elle..OriginalL'auteur CD..
Vous ne pouvez pas le faire fonctionner.
La
using
bloc est utilisé pour libérer des ressources à partir d'objets qui implémentent l'IDisposable
interface aussi rapidement et sûrement que possible.Excel.Workbook
ne pas mettre en œuvreIDisposable
de sorte que vous ne pouvez pas déclarer pour l'utiliser dans unusing
bloc.OriginalL'auteur Justin Niessner
OriginalL'auteur mzonerz