XmlSerializer が生成したコードを取得してみた

.NET で XML の読み書きするのに一番簡単なのはおそらく XmlSerializer。でも、こいつは自動でコードを生成して、コンパイルして、やっと読み書きができるので遅いのが難点です。これでも早くしたそうなので、昔はリフレクションしてたのかな?ついでに日本語版 WinXP だとデッドロックする欠点があるそうです。

ビルドの設定で「シリアル化アセンブリの生成」ってのがあるけど、これの意味がわかりません。オンにしても SGen.exe で作られる Hoge.XmlSerializers.dll が生成されたためしがありません…。もし生成できたら、自動コード生成とコンパイルの部分がいらなくなるの?このあたり、さっぱりわかってないので調べてみないと…。

で、このデッドロックや遅さに最近悩まされてて、どうにかしようとしてます。その過程でこいつが生成するコードに興味がわいてきてしまって、なんとか生成したコードを読めないかとチャレンジしてみました。

もっと簡単な方法がありそうだけど、思いつかなかったのでかなり面倒なことをしました。簡単な方法を思いついた方はコメントください。お待ちしております。

最初はデバッガで止めながら、FileMon でファイルがいつ生成されてるのかを調べてたんだけど、XmlSerializer( type ) を new すると、その中で hoge.cs を吐いてコンパイルして削除まで一気にしてしまうことがわかりました。これじゃあ、cs ファイルは横取りできません。

それなら、ファイル削除のとこで実行を止めちゃえばイイジャンってことで、WinDbg の出番です。ちょっと話がオオゲサになってきました。
まずは、dumpbin /exports C:\Windows\system32\kernel32.dll で DeleteFileW を探します。で、WinDbg で実行ファイルを読み込み、一度実行して適当なところで止めて、kernel32 の DeleteFileW のアドレスを探します。kernel32.dll モジュールの先頭 + さっき調べた DeleteFileW のエントリポイントのアドレスに bp コマンドでブレークを張ります。あとはリスタートすれば、(ほかにファイル削除を使っていなければ)ブレークに止まったときに個人の tmp ディレクトリに XmlSerializer が吐いたコードがあります!

手間を掛けたわりに、読んだところで「で?」っていうコードでした(^^; ここだけ読んでもしょうがないですね。
すべて MS が配っているモノしか使ってないハックでした。