.NET Reflectorさま様

独自に生成したMS-DiffgramをDataSetでReadしているのだが、例外が発生する。

オブジェクト参照がオブジェクト インスタンスに設定されていません。

NullReferenceExceptionなのは解るのだが、この時、頼りになる情報が、DataSet::ReadXmlの中から上がっている、以下のスタックトレースしかないのである。

   場所 System.Data.XMLDiffLoader.ProcessErrors(DataSet ds, XmlReader ssync)
   場所 System.Data.XMLDiffLoader.LoadDiffGram(DataSet ds, XmlReader dataTextReader)
   場所 System.Data.DataSet.ReadXmlDiffgram(XmlReader reader)
   場所 System.Data.DataSet.ReadXml(XmlReader reader, XmlReadMode mode, Boolean denyResolving)
   場所 System.Data.DataSet.ReadXml(XmlReader reader, XmlReadMode mode)

引数のどこにもnullはセットしていないし、生成したDataSetにも問題は無い。ヘルプのどこにも書いていないXMLDiffLoader::ProcessErrorsメソッドで読み込んでいるXMLが気に食わないのだろうと予測は出来るのだが、パーサによる例外とは違い、独自のフォーマットなので例外の原因になったのが、読み込んだXMLの要素なのか、属性なのか、はたまたネームスペースや他のXML構成要素なのかが全く解らない。XMLスキーマを使っているのだから、それなりのエラーを返してくれればまだ想像を馳せることができるのだが、NullReferenceExceptionが発生していること以外に原因を想像させてくれる情報はどこにもないのだ。ILでデバッグするのか? 私がへたれなだけか。なんだかな。

こんな時の最後の頼みはやっぱり.NET Reflectorだ。これがなかったら今回のような例外はとうに投げて(Throw)いただろうと思う。

追記:

やはりXMLに問題があった。.NET Reflectorで当該メソッドを調べたところ、Diffgramはエラー行(error要素)が存在した場合、そのエラー行のid(id属性)で書かれているのと同じidを持つ、元々のデータセット行が存在していることを「大前提」にXMLを読み込んでいるようだ。存在チェックなどは一切しないため、元々の行が無い場合は、即NullReferenceExceptionとなってしまうらしい。
もし、.NET Reflectorが無かったら生成するdiffgramを少し変えてはデバッグ、また少し変えてはデバッグという作業を繰り返していただろう。(.NET Framework自体がなんらかの技術で難読化(Obfascate)されたらこの手も使えなくなるのだが、それだけは勘弁して貰いたい。)