2010-04-11 7 views
0

que je développe un programme pour convertir RTF en html j'utilise les DLL trouvés ici http://www.codeproject.com/KB/recipes/RtfConverter.aspx?fid=1458864&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=3427424&fr=1#xx0xxcomment libérer l'objet de la partie dll?

cette dll enregistre un fichier jpg de HTML dans un dossier spécifique, quand je lance le programme, il cinverts le rtf pour la première fois et enregistre les images dans le dossier parfaitement mais quand j'essaie de le convertir à nouveau j'ai cette erreur "une erreur générique s'est produite dans GDI +" je pense que cette DLL utilise la méthode SaveImage et pour éviter cela dois libérer l'objet Image que vous avez créé, mais je ne peux pas modifier la DLL, est-il un moyen de libérer l'objet que j'ai créé à partir de cette DLL? ceci est mon code

RtfVisualImageAdapter imageAdapter = new RtfVisualImageAdapter(
    @Application.StartupPath + "\\Program Data\\temp\\{0}{1}", 
    System.Drawing.Imaging.ImageFormat.Jpeg); 
RtfImageConvertSettings imageConvertSettings = 
    new RtfImageConvertSettings(imageAdapter); 
RtfImageConverter imageConverter = new RtfImageConverter(imageConvertSettings); 

try 
{ 
    IRtfDocument rtfDocument = RtfInterpreterTool.BuildDoc(
     ConversionText, imageConverter); 
    RtfHtmlConverter htmlConverter = new RtfHtmlConverter(rtfDocument); 
    htmlConverter.Settings.ConvertVisualHyperlinks = true; 
    htmlConverter.Settings.UseNonBreakingSpaces = true; 
    this.richTextBoxPrintCtrl2.Text = htmlConverter.Convert(); 
} 
catch (Exception exception) 
{ 
    MessageBox.Show(this, "Error " + exception.Message, this.Text, 
     MessageBoxButtons.OK, MessageBoxIcon.Error); 
} 

Répondre

0

Si quelque chose implémente IDisposable, vous pouvez appeler sa méthode Dispose(). Les objets sont éligibles pour la récupération de place dès qu'ils sont hors de portée. Vous pouvez également essayer d'appeler le GC.Collect() s'il n'y a plus de références à l'objet que vous souhaitez "publié".

0

Puisque vous avez le code source, vous pouvez l'examiner et savoir où il garde une référence et assurez-vous qu'il est libéré.

Si vous ne savez pas où vous devez faire cela, vous pouvez charger le code dans un AppDomain distinct, et y exécuter votre code. Lorsque vous avez terminé, vous pouvez décharger l'AppDomain et votre application libérera tous les objets. Recréez ensuite l'AppDomain pour la prochaine exécution.

Mais j'essaierais de passer du temps à trouver le vrai problème avant d'utiliser AppDomains.

Et une autre chose. Avez-vous l'erreur GDI lorsque vous exécutez le même fichier deux fois, ou deux fichiers différents successivement? Il se peut qu'il ne parvienne pas à charger l'image du deuxième fichier et vous donne l'erreur.

+0

"Si vous ne savez pas où vous devez faire cela, vous pouvez charger le code dans un AppDomain séparé et y exécuter votre code.Lorsque vous avez terminé, vous pouvez décharger l'AppDomain, et votre application libérera tous les objets. l'AppDomain pour la prochaine course. " désolé mais je ne peux pas comprendre cela. "Et une autre chose: obtenez-vous l'erreur GDI lorsque vous exécutez deux fois le même fichier, ou deux fichiers successifs? Il se peut qu'il échoue à charger l'image du deuxième fichier et vous donne l'erreur." l'erreur est que le fichier est utilisé par une autre application ou un programme merci, – Mohamed

+0

Vos questions indique l'erreur à être:" erreur une erreur générique est survenue dans GDI + ", ce qui ne veut pas dire qu'il est utilisé par Sinon, vous obtenez une autre erreur ou une autre erreur? Les domaines d'application, par exemple, sont très utiles pour les composants COM que vous voulez décharger, car c'est en fait le seul moyen de décharger. –

+0

Créer et libérer appDomains n'est pas aussi trivial que ça en a l'air, mais est-ce que libérer AppDomain libère également des ressources non managées? – Asher

0

As Max sez. Ou mieux utiliser la construction utilisant. N'appelez JAMAIS GC.Collect, sauf si vous êtes sûr de le faire en libérant quelques Go ou RAM!

+0

la construction using me donne l'erreur qu'un objet qui n'implémente pas la méthode dispose ne peut pas être dans une construction utilisant – Mohamed

+0

Ensuite, les classes n'implémentent pas l'interface IDispose, vous ne pouvez rien faire sans accès au code, vérifiez le code avec réflecteur et essayez de voir si vous pouvez émuler l'erreur. Êtes-vous sûr que votre chemin vers l'image est correct et que votre processus y a accès? –

1

Le code est bâclé, il n'appelle pas la méthode Dispose() sur le bitmap après l'avoir enregistré. Cela maintient un verrou sur le fichier, GDI + utilise un fichier mappé en mémoire pour éviter d'exercer une pression sur le fichier d'échange. Important car les bitmaps peuvent être assez volumineux. Essayer d'enregistrer à nouveau le même fichier échoue à cause du verrou. Les messages d'exception GDI + sont notoirement sloppy aussi bien. Je pense que le bogue se trouve dans Interpreter \ Converter \ Image \ RtfImageConverter.cs, méthode SaveImage(). Le bitmap "convertedImage" n'est pas éliminé. Notez que l'objet Graphics dans cette même méthode n'est pas éliminé non plus. Corrigez-le en les enveloppant avec l'instruction using.

Exécutez ce code via FxCop pour détecter des erreurs similaires. Et demandez-vous si vous vraiment voulez maintenir le code comme ça.

+0

merci pour votre réponse nobugz, \t 'Itenso.Rtf.Converter.Image.RtfImageConvertSettings': type utilisé dans une instruction using doit être implicitement convertible en 'System.IDisposable' \t c'est l'erreur que je reçois en essayant de les envelopper avec l'instruction using. Je ne peux pas surmonter ça. désolé mais que voulez-vous dire par "demandez-vous si vous voulez vraiment maintenir le code comme ça." – Mohamed

+0

Vous l'avez mis au mauvais endroit. Vous ne savez pas exactement ce que vous avez fait, appelez simplement la méthode convertedImage.Dispose() après l'appel Save(). –

Questions connexes