不具合? : 継承メソッドが Renaming されない?
どこから仕様でどこがバグなのか、まだはっきりとしていないのだが、今回ためした4つバージョンすべてで、特定の条件で Renaming が働かず、MissingMethodException になってしまった。
public class BaseClass { public virtual void DoIt() { ... } public void MoreDoIt() { ... } } public class ExtClass : BaseClass { public override void DoIt() { ... } } public class MoreExtendClass : ExtClass { private void MyMethod() { this.MoreDoIt(); // (A) MoreDoIt(); // (B) base.MoreDoIt(); // (C) } }
上記の (A), (B), (C) はすべて BaseClass.MoreDoIt() への呼び出しなのだが、これを難読化した場合 (A) と (B) はリネーム後の MoreDoIt() に変更されるのだが、(C) が MoreDoIt() のままになってしまっているようだ。難読化後のソースイメージは
public class @1 { public virtual void @1() { ... } public void @2() { ... } } public class @2 : @1 { public override void @1() { ... } } public class @3 : @2 { public void @3() { this.@1(); // (A) @1(); // (B) base.MoreDoIt(); // (C) こんなメソッドは存在しない! } }
こんなかんじになる。私の場合、上記の例のように同じ意味になる場合は常に (A) の形式でメソッドを呼び出しを記述するため、この問題の再現最小コードを作ろうとして (A) の記述をし、再現しない!いったいどこに問題が!?なんてかんじでちょっと手間取った。
プロダクト全体の難読化を実際に試していたので、問題が発生していたクラスの実装は base. になっていたのだ。回避方法がわかったとえはいえ、すでにプロジェクトからいなくなった人を含め、何人が (C) の書き方をしているだろうか? と考えると頭が痛い…。