最適化で GC.KeepAlive() が無効になる?
csc /o+ /debug- だと次のコードは「 GC による回収済み delegate へのアクセス」で NullReferenceException が発生する。csc /o+ /debug+ だと平気なので、JIT Tracking を無効にする最適化を実施すると GC.KeepAlive() が効かなくなるような最適化をやってしまうらしい?
おじさんの環境だけですか?
private delegate bool ProgressHandler(int tag, int percent); [DllImport("test.dll")] private static extern int PInvokeAPI(int tag, ProgressHandler progress); private int Run(int tag) { ProgressHandler callback = new ProgressHandler(this.OnProgress); try { return PInvokeAPI(tag, callback); } finally { GC.KeepAlive(callback); } } // PInvokeAPI の中から何回も呼び出される private bool OnProgress(int tag, int percent) { // continue processing return true; }