2015-07-24 3 views
2

Я экспериментирую с утомительной проблемой с процедурой C#, которую я не могу решить. Я разрабатываю приложение, которое открывает ESRI ShapeFile, используя библиотеку GDAL (библиотеку DLL, написанную на C++ для управления географическими данными), и показывает карту в компоненте PictureBox. Когда я использовать вектор объектов System.Drawing.Point рисовать многоугольники я получаю следующее сообщение:Как поймать FatalExecutionEngineError в C#?

Managed DEBUGGING Помощник «FatalExecutionEngineError» обнаружил проблему в «C: \ Users \ Polli \ ipeageo-ГИТ \ IpeaGEO \ Bin \ Debug \ IpeaGEO.vshost.exe. Дополнительная информация: Время выполнения обнаружило фатальную ошибку. Адрес ошибки равен 0x6ced9a0f, в потоке 0x1618. Код ошибки: 0xc0000005.

Это код, который бросает исключение:

private void drawGeometry(Geometry geo, Graphics g, bool fill) 
{ 
    // Some code here... 
    // ... 

    // Get the points count and the array to ask GDAL for coordinates. 
    int count = geo.GetPointCount(); 
    double[] v = new double[2]; 
    Point[] polygon = new Point[count]; 

    for (int pid = 0; pid < count; pid++) 
    { 
     geo.GetPoint(pid, v); // This is a call to GDAL (unmanaged) code. 
     polygon[pid].X = getX((float)v[0]); 
     polygon[pid].Y = getY((float)v[1]); 

     // The Exception occurs just HERE! 
     g.DrawPolygon(fgPen, polygon); // <--- EXCEPTION!!! 
     if (fill) g.FillPolygon(fillBrush, polygon); 
    } 

    // Some code here... 
    // ... 
} 

У меня есть другая версия этой функции, которая прекрасно работает, где я рисую каждый сегмент линии без выделения памяти:

private void drawGeometry(Geometry geo, Graphics g, bool fill) 
{ 
    // Some code here... 
    // ... 

    Point start = new Point(), current = new Point(), previous = new Point(); 

    // Get the points count and the array to ask GDAL for coordinates. 
    int count = geo.GetPointCount(); 
    double[] v = new double[2]; 

    for (int pid = 0; pid < count; pid++) 
    { 
     geo.GetPoint(pid, v); // This is a call to GDAL (unmanaged) code. 
     if (pid == 0) 
     { 
      start.X = previous.X = getX((float)v[0]); 
      start.Y = previous.Y = getY((float)v[1]); 
     } // if 
     else 
     { 
      previous.X = current.X; 
      previous.Y = current.Y; 
     } // else 

     current.X = getX((float)v[0]); current.Y = getY((float)v[1]); 
     g.DrawLine(fgPen, previous.X, previous.Y, current.X, current.Y); 
    } // for 
    g.DrawLine(fgPen, start.X, start.Y, current.X, current.Y); 

    // Some code here... 
    // ... 
} 

Мне нужно заполнить несколько полигонов, и я не могу сделать это со второй версией кода (это работает нормально). Использование try ... catch не содержит исключения.

Я думаю, что проблема возникает, когда сборщик мусора работает в фоновом режиме, и я пытаюсь получить доступ к переменной многоугольник (то есть вектор около 2000 элементов ... и этот код находится внутри для заявления).

Кто-нибудь знает, как поймать (или, даже лучше, избежать) такое исключение?

+2

Я думаю, вы неправильно поняли название этого исключения. Причина, по которой она называется «фатальной», состоит в том, что она есть, нет надежды продолжить выполнение этого процесса, она обречена. Единственное решение - выяснить, почему это происходит, и исправить это, но вы не можете его поймать. –

+0

Проблема в том, что я не могу избежать возникновения Исключения. Мне нужно найти способ избежать конкуренции с сборщиком мусора. Проблема возникает, когда я обращаюсь к вектору __polygon__ (я думаю, что он может быть заблокирован сборщиком мусора). –

+0

Я не думаю, что это проблема GC. Мое предположение; ваша библиотека на C++ требует «geo.GetPoint (pid, ** ref ** v);« Но у вас есть изменение для декларации «GetPoint» для этого (в вашем коде обертки (если это не ваше, у вас есть проблемы)) ... – EZI

ответ

0

FatalExecutionEngineError не улавливаются при обработке исключений, они обычно являются системными ошибками или ошибками маршала, и оба они не могут обрабатываться в приложении .NET.

Смежные вопросы