как освободить объект от dll партии? - PullRequest
0 голосов
/ 11 апреля 2010

Я разрабатываю программу для преобразования RTF в HTML я использую библиотеки DLL, найденные здесь http://www.codeproject.com/KB/recipes/RtfConverter.aspx?fid=1458864&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=3427424&fr=1#xx0xx

эта dll сохраняет файл jpg из html в определенную папку, когда я запускаю программу, она впервые конвертирует RTF и прекрасно сохраняет изображения в папку но когда я пытаюсь преобразовать это снова, я вижу эту ошибку msgstr "ошибка: общая ошибка произошла в GDI +" Я думаю, что эта DLL использует метод SaveImage и, чтобы избежать этого, вы должны освободить созданный вами объект Image, но я не могу изменить DLL, Есть ли способ освободить объект, который я создал из этой DLL? это мой код

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);
}

Ответы [ 4 ]

1 голос
/ 11 апреля 2010

Код небрежный, он не вызывает метод Dispose () в растровом изображении после его сохранения. Это сохраняет блокировку файла, GDI + использует отображенный в памяти файл, чтобы избежать давления на файл подкачки. Важно, потому что растровые изображения могут быть довольно большими. Попытка сохранить в тот же файл снова не удается из-за блокировки. Сообщения об исключениях GDI + также известны своей небрежностью.

Я думаю, что ошибка находится в методе Interpreter \ Converter \ Image \ RtfImageConverter.cs, SaveImage (). Растровое изображение "convertImage" не удаляется. Обратите внимание, что объект Graphics в этом же методе также не удаляется. Исправьте это, обернув их оператором using.

Запустите этот код через FxCop, чтобы поймать подобные ошибки. И спросите себя, действительно ли вы хотите сохранить подобный код.

0 голосов
/ 11 апреля 2010

Поскольку у вас есть исходный код, вы можете проверить его, выяснить, где он хранит ссылку, и убедиться, что он выпущен.

Если вы не можете понять, где это сделать, вы можете загрузить код в отдельный AppDomain и выполнить там свой код. Когда вы закончите, вы можете выгрузить AppDomain, и ваше приложение освободит любые объекты. Затем заново создайте домен приложения для следующего запуска.

Но я бы постарался потратить некоторое время на выяснение реальной проблемы перед использованием доменов приложений.

И еще одна вещь. Вы получаете ошибку GDI, когда вы выполняете один и тот же файл дважды или два разных файла подряд? Возможно, он не загружает изображение второго файла и выдает ошибку.

0 голосов
/ 11 апреля 2010

Как Макс Сез. Или лучше использовать конструкцию с использованием. НИКОГДА не вызывайте GC.Collect, если только вы не уверены, что сделаете это, и вы освободите несколько ГБ или ОЗУ!

0 голосов
/ 11 апреля 2010

Если что-то реализует IDisposable, вы можете вызвать его Dispose() метод. Объекты могут собираться мусором, как только они выходят из области видимости, поэтому вы можете также попытаться вызвать GC.Collect() после того, как больше нет ссылок на объект, который вы хотите "освободить".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...