XmlSerializerでの例外
起動時や終了時に設定ファイルを読み書きする処理をいれるとこの例外は発生し始めた。
この例外が誰が吐いているのかチェックすると、
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を使っているのでこれに大して実行します。
そうすると「zapper.XmlSerializer.dll」というDLLが新しく作成されます。
これで例の例外は発生しなくなります。気になる方はどうぞ試してください。
| 固定リンク
「ソフトウェア・開発」カテゴリの記事
- 複数フォルダを個別にZipに(2012.02.04)
- マンガビューア marmi(2009.07.26)
- ほぼリアルタイム翻訳掲示板(2009.08.09)
- CSTimer 1.50リリース(2009.05.08)
- VisualStudio2010のエディタを軽い動作に(2011.09.05)
コメント