kkamegawaの購入記録

漫画、小説、映画や買ったものの記録をつらつらしていきます。昔は一部技術情報もありました…

XmlSerializerで、System.IO.FileNotFoundException発生

 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。これは前述の本家版になるのかな?  で、私はどうしたかといえば...どうしよう(汗)。やはり自分でこりごりコード書くしかないかなぁ。