IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Comportement bizarre dans dll


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 987
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 987
    Par défaut Comportement bizarre dans dll
    Bonjour,

    J'ai réalisé un bout de code qui créé un document pdf à partir d'un document excel.
    A la fin du traitement, je n'ai plus besoin de ce fichier alors je le supprime via File.Delete.

    Lorsque ce code ce trouve dans une application windows form, le fichier est bien supprimé mais lorsque que je décide de le placer dans une dll, il ne fonctionne plus.

    Le plus bizarre réside dans le fait que si j'exécute le code dans la dll en pas à pas à partir de l'application windows form, cela fonctionne.

    J'ai mis des log un peu partout pour tracer
    J'ai essayé de mettre un sleep de dix seconde pour être large, le coucou apparait après le sleep mais les coucou près le File.Delete n'apparaissent jamais.

    Quelqu'un a t-il une idée sur pourquoi avec le même code, je n'ai pas le même comportement dans une application graphique et dans une dll et pourquoi en pas à pas dans la dll ça fonctionne ?

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194
    Par défaut
    j'ai un doute mais si tu utilise des FileStream il faut pas oublier de le mettre dans un using pour appeller la methode Close et liberer les ressources

  3. #3
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 987
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 987
    Par défaut
    Je passe par l'interop avec excel, Excel.Application n'implémente pas IDisposable et ne peux pas être utilisé avec using
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    Excel.Application excelApp = new Excel.Application();
                try
                {
                    Excel.Workbook doc = excelApp.Workbooks.Open(gedThumbnailCriteria.FullName, missing, missing, missing, 
                                                                    missing, missing, missing, missing, missing, missing,
                                                                    missing, missing, missing, missing, missing);
     
                    doc.ExportAsFixedFormat(Excel.XlFixedFormatType.xlTypePDF, PdfFullName,
                                            Excel.XlFixedFormatQuality.xlQualityStandard, true, true, missing,missing,
                                            false, missing);
     
                    doc.Close(saveChanges, missing, missing);
                    excelApp.Quit();
                }
                catch
                {
                    canProcess = false;
                }
                finally
                {
                    Marshal.ReleaseComObject(excelApp);
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
                }
                if (canProcess)
                {
                    gedThumbnailCriteria.FullName = PdfFullName;
                    ret = CreateThumbnail(gedThumbnailCriteria);
                    System.IO.File.AppendAllText(@"C:\Test\ged.txt", "Checkpoint 2" + Environment.NewLine);
                }
     
                if (File.Exists(PdfFullName))
                {
                    System.IO.File.AppendAllText(@"C:\Test\ged.txt", "Checkpoint 3" + Environment.NewLine);
                    try
                    {
                        Thread.Sleep(10000);
                        System.IO.File.AppendAllText(@"C:\Test\ged.txt", "Checkpoint 4" + Environment.NewLine);
                        File.Delete(PdfFullName);
                    }
                    catch
                    {
                        System.IO.File.AppendAllText(@"C:\Test\ged.txt", "Checkpoint 5" + Environment.NewLine);
                    }
                    System.IO.File.AppendAllText(@"C:\Test\ged.txt", "Checkpoint 6" + Environment.NewLine);
                }
                System.IO.File.AppendAllText(@"C:\Test\ged.txt", "Checkpoint 7" + Environment.NewLine);
                return ret;

    Comme vous le voyez j'ai même rajouté un catch au cas où

    Ici je passe par l'interop d'excel et convertit le document en pdf. Mon fichier PDF est bien créer et excel n'apparait plus dans les processus au moment ou je veux supprimer le PDF

    Le but est de créer une miniature du document excel et la méthode que j'utilise ne peut le faire directement sur un fichier excel mais peut le faire à partir d'un PDF. C'est pour cela que je créer le PDF mais une fois que j'ai ma miniature je n'est plus besoin du PDF.

    La seule chose qui peux locker le PDF, c'est le code qui génère la miniature mais ce code fonctionne parfaitement si je le sort de la dll et que je l'implente directement dans l'application windows form.

  4. #4
    Membre extrêmement actif

    Homme Profil pro
    Software Developer
    Inscrit en
    Mars 2008
    Messages
    1 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Software Developer

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 470
    Par défaut
    J'ai déja eu un probleme similaire mais ca fait un bout de temps

    Essaie ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    doc = null;
    excelApp = null;
    Ensuite regarde dans ton gestionnaire des taches pour voir si EXCEL.EXE n'apparait plus.

  5. #5
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 987
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 987
    Par défaut
    Citation Envoyé par alex_vino Voir le message
    J'ai déja eu un probleme similaire mais ca fait un bout de temps

    Essaie ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    doc = null;
    excelApp = null;
    Ensuite regarde dans ton gestionnaire des taches pour voir si EXCEL.EXE n'apparait plus.

    Comme je l'ai écrit dans mon précédent post, je n'ai plus Excel dans le gestionnaire des taches :
    Citation Envoyé par popo
    Ici je passe par l'interop d'excel et convertit le document en pdf. Mon fichier PDF est bien créer et excel n'apparait plus dans les processus au moment ou je veux supprimer le PDF
    J'ai finalement résolu mon problème par hasard bien que je ne comprenne pas pourquoi.

    Je n'aimais pas le fait que mon objet de miniature allait s'occuper lui même de la conversion excel vers PDF (SRP). J'ai donc crée une classe pour le faire et
    implémentant l'interface IDisposable en faisant la suppression du PDF dans le dispose mais ça ne fonctionnait toujours pas.

    Je devais faire la même chose pour les documents Word et l'idée de déclarer une même procédure (qui génère le nom du PDF en fonction du nom du document d'origine et des documents déjà présent dans le répertoire) dans ces deux classes ne me plaisait pas non plus (DRY). J'ai donc déclaré un classe static pour cette méthode et fait hérité mes deux classes de celle-ci.

    En appliquant le principe DRY encore une fois pour le dispose j'ai résolu mon problème.
    C'est la que je ne comprend pas. Comme se fait-il qu'en déclarant le dispose dans mes classes filles, ça ne fonctionne pas alors que ça fonctionne si je le déclare dans la classe mère ?
    Une histoire de ressource non libérée ? Mais pourtant ma classe mère est static donc non instanciable (à moins que je débloque complètement).

    Bref, ça marche. Je passe donc en "Résolu" mais je n'aime pas rester sans comprendre. Si quelqu'un pouvait éclairer ma lanterne...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Flex4] Doublons dans datagrid = comportement bizarre..
    Par baobab95 dans le forum Flex
    Réponses: 3
    Dernier message: 04/04/2012, 17h32
  2. Comportement bizarre dans POI
    Par bruno.wiesen dans le forum Documents
    Réponses: 1
    Dernier message: 23/05/2007, 11h04
  3. [HttpClient] comportement bizarre, saute des catch()...
    Par iubito dans le forum Développement Web en Java
    Réponses: 4
    Dernier message: 04/02/2004, 15h25
  4. [Sybase] Comportement bizarre d'une table
    Par sdozias dans le forum Sybase
    Réponses: 4
    Dernier message: 03/02/2004, 10h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo