« 定規を手直し | トップページ | ロジクールのマウス不調→交換 »

XmlSerializerでの例外

結構前から気になっていたけど問題ないので放置していたXmlSerializerでの例外について調べてみた。どんな問題かというとXMLをRead/Writeするときに必ず下のキャプチャのように

'System.IO.FileNotFoundException' の初回例外が mscorlib.dll で発生しました。

という例外が発生するのだ。

ExceptionOutput

起動時や終了時に設定ファイルを読み書きする処理をいれるとこの例外は発生し始めた。

この例外が誰が吐いているのかチェックすると、

   1: //
   2: //初期化.configファイルの読み込み
   3: //
   4: string path = Path.Combine(Application.StartupPath, configName);
   5: if (File.Exists(path))
   6: {
   7:     FileStream fs = new FileStream(path,
   8:         FileMode.Open,
   9:         FileAccess.Read);
  10:     //TODO: XmlSerializerが例外を2つ投げている。
  11:     //'System.IO.FileNotFoundException' の初回例外が mscorlib.dll で発生しました。
  12:     System.Xml.Serialization.XmlSerializer xs =
  13:         new System.Xml.Serialization.XmlSerializer(
  14:             typeof(MyAppSetting));
  15:     //読み込んで逆シリアル化する
  16:     m_setting = (MyAppSetting)xs.Deserialize(fs);
  17:     fs.Close();
  18: }

System.Xml.Serialization.XmlSerializerを生成しているときに発生していることが判明。

でネット上で調べてみるとあまりメジャーな問題ではないのか「インストールし直せ(OSを!?)」ぐらいの恐ろしい書き込みに出会ったり(しかもその回答書いているのがMVPだったりする)・・・。

で、どうも本当の答えは「MDA(マネージ デバッグ アシスタント)によって発生している例外」で

XmlSerializer を作成した時、その型に対する 型付き XmlSerializer を持っているアセンブリがロードされていなければ、まずそのアセンブリを一通り探し、見つからなければ動的に型付き XmlSerializer を生成。

この「見つからなかった」事に対するMDAの報告が上記の例外のよう。

ではどうすればよいのか。それはsgen.exeで「指定されたアセンブリの型に対して XML シリアル化アセンブリを作成」すれば良いらしい。早速やってみた。

SDKコマンドプロンプトからsgenを実行(実際のパスは違います)。今回は開発中のzapper.exeというファイルの中でXmlSerializerを使っているのでこれに大して実行します。

ExceptionCmdline

そうすると「zapper.XmlSerializer.dll」というDLLが新しく作成されます。

ExceptionFolder3

これで例の例外は発生しなくなります。気になる方はどうぞ試してください。

|

« 定規を手直し | トップページ | ロジクールのマウス不調→交換 »

ソフトウェア・開発」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2371/44360145

この記事へのトラックバック一覧です: XmlSerializerでの例外:

« 定規を手直し | トップページ | ロジクールのマウス不調→交換 »