静的にリンクされたランタイムパッケージと、それらを使用するデザインタイムパッケージを使用するアプリケーションがあります。何らかの理由で、ユニットファイナライズセクションのコードが実行時に実行されていません(これがいつ発生し始めたかはわかりません)。
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
誰かがこれの理由および/または回避策を知っていますか?通常、外部リソースがクリーンアップされていないことに気付くまで、ファイナライズが実行されていないことに気付かない場合があります。