Исключение GDI+ при использовании DrawString()

Я получаю сообщение об ошибке при попытке создать изображение штрих-кода с использованием шрифта штрих-кода. Это происходит в производстве, но не в разработке.

Метод создания штрих-кода:

/// <summary>
/// Create a barcode image by writing out a string using a barcode font and save it
/// </summary>
/// <param name="barcodeText">The text string of the barcode</param>
/// <param name="saveLocation">Where to save the file to</param>
/// <param name="font">The barcode font</param>
/// <param name="imageFormat">The image format</param>
private void CreateBarcodeImage(string barcodeText, string saveLocation, System.Drawing.Font font, ImageFormat imageFormat)
{
    // Draw the barcode image
    using (Bitmap bmp = new Bitmap(500, 75))
    {
    try
    {
        using (Graphics g = Graphics.FromImage(bmp))
        {
        g.Clear(_backgroundColour);
        g.DrawString(barcodeText, font, _foregroundBrush, 10, 0);
        bmp.Save(saveLocation, imageFormat);
        g.Dispose();
        }
    }
    catch (Exception ex)
    {
        Log.ErrorException("Exception in LabelPrinter.CreateBarcodeImage()", ex);
        throw;
    }
    }
}

Этот код вызывается в цикле, так как требуется несколько штрих-кодов. В среде разработки он работает нормально, но в режиме реального времени (в Win XP Pro с использованием .net 3.5 SP1 в приложении winforms) создаются 2 штрих-кода, и исключение возникает в третий раз.

Возникающее исключение и трассировка стека:

An unhandled exception has occurred Attempted to read or write protected memory. This is often an indication that other memory is corrupt. 
at System.Drawing.SafeNativeMethods.Gdip.GdipMeasureString(HandleRef graphics, String textString, Int32 length, HandleRef font, GPRECTF& layoutRect, HandleRef stringFormat, GPRECTF& boundingBox, Int32& codepointsFitted, Int32& linesFilled) 
at System.Drawing.Graphics.MeasureString(String text, Font font, SizeF layoutArea, StringFormat stringFormat) 
at System.Drawing.Graphics.MeasureString(String text, Font font) 
at Srcl.WasteTrak.Gui.Documents.LabelPrinter.CreateBarcodeImage(String barcodeText, String saveLocation, Font font, ImageFormat imageFormat) 
in c:\scc\SRCL\SRCL.WasteTrak\SRCL.WasteTrak.Gui\Documents\LabelPrinter.cs:line 60 

Я не могу выяснить, что вызывает проблему, но из поиска в Google кажется, что это вызвано вызовами неуправляемого кода, но я не нашел решения.

Кто угодно?


person Ciaran O'Neill    schedule 30.06.2009    source источник
comment
Пробовали ли вы использовать другой шрифт, просто чтобы посмотреть, есть ли разница? Кстати, вы дважды вызываете .Dispose() для объекта Graphics.   -  person Dan Byström    schedule 30.06.2009
comment
Да, я пробовал использовать другой шрифт (текущий шрифт штрих-кода), и я использовал другой (обычный) встроенный шрифт, а также ссылался на системный шрифт и все тот же результат. g.Dispose() был удален, но все тот же   -  person Ciaran O'Neill    schedule 30.06.2009
comment
Приложение развернуто ClickOnce - мне интересно, является ли это частью проблемы вообще   -  person Ciaran O'Neill    schedule 30.06.2009
comment
Так вы говорите, что проблема остается, даже если вы используете другой шрифт? Хм, вы убедились, что шрифт не удаляется, когда вы рисуете им? То же самое касается _foregroundBrush.   -  person Dan Byström    schedule 01.07.2009
comment
это происходило на нескольких компьютерах или только на одном? (производство) И это работало на нескольких компьютерах разработчиков или только на одном? Вам когда-нибудь удавалось это решить?   -  person Steffen Winkler    schedule 31.05.2015


Ответы (1)


Не могли бы вы попробовать удалить следующую строку

г.Распоряжаться();

оператор using уже удалит его.

person Hakan Cakirkan    schedule 13.09.2017