xsd.exeが生成したソースをXmlSerializerにかけるとSystem.IO.FileNotFoundExceptionが発生するという現象に見舞われました。まだ解決していませんが、結構全世界ではまっている人がいるようなので、少しまとめてみました。
Visual Studio .NET 2003に付属しているxsd.exeを使用して、
XMLファイルから
XMLスキーマを作成、さらに
C#のクラスファイルを作って、XmlSerializer経由で
XMLの読み込みをするプログラムを作りました。
参考:
作成されたソースをプロジェクトに追加して
シリアライズのコードを追加します。
XmlSerializer oXmlSerialMyClass = new XmlSerializer(typeof(MyClass));
すると、この箇所でSystem.IO.FileNotFoundExceptionが発生します。例外の内容を見てみると、こんなメッセージが出ています。
=== Pre-bind state information ===
LOG: Where-ref bind. Location = C:\\DOCUME~1\\username\\LOCALS~1\\Temp\\_1tu0gjb.dll
LOG: Appbase = F:\\Dev\\solutionname\\projectname\\bin\\Debug\\
LOG: Initial PrivatePath = NULL
Calling assembly : (Unknown).
===
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///C:/DOCUME~1/username/LOCALS~1/Temp/_1tu0gjb.dll.
ファイルまたはアセンブリ名 _1tu0gjb.dll(注:この名前は毎回変わる)、またはその依存関係の 1 つが見つかりませんでした。
まず、このエラーは
ASP.NETではよく出ているみたいです。ぐぐってみたら、
ASP.NETで動いているサービスアカウントが
WindowsのTEMP(%SYSTEMROOT%\TEMP)ディレクトリへのアクセス権限がないために発生するというパターン。これはまぁセキュリティ上のリスクが発生するかもしれませんが、権限を変えれば動くことは動くそうです。
私のはコンソール
ツールですから該当しません。日本では困っている人がいなさそうだったので、
英語圏まで広げて検索してみました。最初に見つけたのは、
XmlSerializer instantiation problem: 'System.IO.FileNotFoundException by mscorlib.dll'。このReplyに「.NETをインストールしなおせ」なんて怖いことが書いてますね(^^;。もうひとつのコメントには名前の重複があったから発生したということが書かれています。が、提示されたソースには重複はちょっと見えません(私が
XMLのこと理解していないから「よくないよ!」と一発でわかる方いたら教えてください)。
もう一人
instantiation of xmlserializer gives me error in [randomname].dllという質問されている人がいました。こちらには
Microsoftの人が公開している非サポート
ツールで調べられるよ!というまともなコメントがついています。それが
XmlSerializerPreCompiler。この方はほかにもよさげな
ツールを公開されています。うちも調べてみたら、ばっちり該当しました(;_;)。二つほど問題がありました。
XmlSerializer関係のトラブルシューティングをまとめた
Troubleshooting with the XmlSerializerMVPの人みたいです。最後に、本家本元、MSから公開されている
Troubleshooting Common Problems with the XmlSerializer。これは前述の本家版になるのかな?
で、私はどうしたかといえば...どうしよう(汗)。やはり自分でこりごりコード書くしかないかなぁ。