У меня есть приложение, которое использует статически связанные пакеты времени выполнения, а также пакеты времени разработки, которые их используют.По какой-то причине код в любом разделе завершения работы модуля не выполняется во время выполнения (я не могу сказать, когда это начало происходить).
finalization
ShowMessage('Goodbye');
end.
При закрытии Delphi отображается сообщение, но не когда приложение закрываетсявниз.Это становится более странным, если я ставлю точку останова на ShowMessage, она ломается там, но не выполняет строку.Если в финализации несколько строк, отладчик останавливается на первой строке, не выполняет ее и затем переходит к концу.
procedure ProcOne;
begin
SomeObject.Free; // Debugger does not enter or stop here
SomeObject := nil;
end;
finalization
ProcOne; // Debugger stops here, doesn't execute, jumps to "end."
ProcTwo; // Every line has a blue dot
ShowMessage('Bye');
end.
Стек вызовов на точке останова ProcOne показывает @ Halt0 => FinalizeUnits => MyPackage.MyUnit.Finalization.
Если я включаю модуль в приложение, которое не использует пакеты, все выполняется правильно.
У кого-нибудь есть идеи, что может быть причиной этого?
РЕДАКТИРОВАТЬ:
Благодаря комментарию Аллена Бауэра, указывающего в правильном направлении, мне удалось выделить проблему.Кажется, проблема возникает, если приложение создается с пакетом времени выполнения, а затем динамически загружает другой пакет, который также ссылается на этот пакет и модуль.
Я создал тестовый проект, который демонстрирует проблему: TestFinalization
Кто-нибудь знает причину этого и / или обходного пути?Обычно вы можете не заметить, что ваша финализация не запускается, пока вы не заметите, что внешние ресурсы не очищаются.