Мы имеем дело с тем, что GC слишком быстр в программе .Net.
Поскольку мы используем класс с нативными ресурсами и не вызываем GC.KeepAlive (), GC собирает объект до того, как закончится собственный доступ. В результате программа вылетает.
У нас есть именно такая проблема, как описано здесь:
Выполняет ли сборщик мусора .NET прогнозный анализ кода?
Вот так:
{ var img = new ImageWithNativePtr();
IntPtr p = img.GetData();
// DANGER!
ProcessData(p);
}
Дело в том, что JIT генерирует информацию, которая показывает GC, что img не используется в момент запуска GetData (). Если GC-поток приходит в нужное время, он собирает img и программа вылетает. Это можно решить, добавив GC.KeepAlive (img);
К сожалению, уже написано слишком много кода (в слишком многих местах), чтобы легко устранить проблему.
Следовательно: существует ли, например, Атрибут (то есть для ImageWithNativePtr), чтобы заставить JIT вести себя как в сборке отладки? В сборке Debug переменная img будет оставаться действительной до конца области видимости (}), а в Release она теряет допустимость при комментарии DANGER.