Я экспериментирую с утомительной проблемой с процедурой 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 элементов ... и этот код находится внутри для заявления).
Кто-нибудь знает, как поймать (или, даже лучше, избежать) такое исключение?
Я думаю, вы неправильно поняли название этого исключения. Причина, по которой она называется «фатальной», состоит в том, что она есть, нет надежды продолжить выполнение этого процесса, она обречена. Единственное решение - выяснить, почему это происходит, и исправить это, но вы не можете его поймать. –
Проблема в том, что я не могу избежать возникновения Исключения. Мне нужно найти способ избежать конкуренции с сборщиком мусора. Проблема возникает, когда я обращаюсь к вектору __polygon__ (я думаю, что он может быть заблокирован сборщиком мусора). –
Я не думаю, что это проблема GC. Мое предположение; ваша библиотека на C++ требует «geo.GetPoint (pid, ** ref ** v);« Но у вас есть изменение для декларации «GetPoint» для этого (в вашем коде обертки (если это не ваше, у вас есть проблемы)) ... – EZI