2012-01-06 17 views
11

XMLをデシリアライズしているうちに、最近FileNotFoundExceptionが散発的にスローされています。メッセージは、XMLからコードへのマッピングに使用された一時アセンブリが見つからないというメッセージです。 this文書から、このファイルが.NET Frameworkによって作成されない場合に発生する可能性があります(内部例外でもキャプチャされない理由があります)。ここでXMLのデシリアライズ時にFileNotFoundExceptionが発生しました

は例外です:

Type : System.IO.FileNotFoundException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
Message : Could not find file 'C:\Documents and Settings\user\Local Settings\Temp\c5_nfoko.dll'. 

ファイル名は、すべてのエラーに異なりますが、エラーは常に同じで、それはここから(下部のフルコールスタックを)発信:

at System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping, Type type, String defaultNamespace) 
at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace) 
at System.Xml.Serialization.XmlSerializer..ctor(Type type) 

CSharpCodeGeneratorがアセンブリを生成しようとしたとき。私たちはこのコードを何年もの間プロダクションで使ってきましたが、非常に安定していました。先週末に失敗し始めたばかりです。 Microsoft security patchは、複数のオペレーティングシステム(XPおよびServer 2003)上の.NET 2.0および.NET 4.0のコードのバージョンに影響するため、最新のMicrosoft security patchと何か関係があるかどうかは疑問でした。

エラーは散発的で、通常はプロセスを再実行すると、通常は消えます。これは、ファイルを取得してデータベースに挿入するシングルスレッドのコマンドラインアプリケーションです。

同じ問題を抱えている人は誰も見つかりませんでしたが、同じコード行には分かれていません。System.Xml.Serializationコードを使用する場所が2つあり、このエラーが発生していますそれぞれから。このコードは、私たちが最近変更したものでもありません。

最も近い他の投稿はthisです。

私たちのQA VMでは、ウイルススキャナはありませんので、問題はないと思います。この問題は、ホスティング環境と別のクライアントサイトの両方で発生しています。

我々は試してみました

  1. をこの一時ディレクトリをクリーンアップ
  2. tempディレクトリのパーミッションを確認する(ユーザーがボックスにローカル管理者である)
  3. 生成XmlSerializers.dllのsgen.exeを使用して展開することで、それらをアプリケーションフォルダに追加します(.NET Frameworkがこれらのアセンブリを使用しないように問題は解決しません)。

誰でも役に立つと思われるアイデアや提案があれば、

全コールスタック:

Type : System.IO.FileNotFoundException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
Message : Could not find file 'C:\Documents and Settings\user\Local Settings\Temp\c5_nfoko.dll'. 
Source : mscorlib 
Help link : 
FileName : C:\Documents and Settings\user\Local Settings\Temp\c5_nfoko.dll 
FusionLog : 
Data : System.Collections.ListDictionaryInternal 
TargetSite : Void WinIOError(Int32, System.String) 
Stack Trace : at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) 
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) 
at Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch(CompilerParameters options, String[] fileNames) 
at Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch(CompilerParameters options, String[] sources) 
at Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch(CompilerParameters options, String[] sources) 
at System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource(CompilerParameters options, String[] sources) 
at System.Xml.Serialization.Compiler.Compile(Assembly parent, String ns, XmlSerializerCompilerParameters xmlParameters, Evidence evidence) 
at System.Xml.Serialization.TempAssembly.GenerateAssembly(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, Evidence evidence, XmlSerializerCompilerParameters parameters, Assembly assembly, Hashtable assemblies) 
at System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, String location, Evidence evidence) 
at System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping, Type type, String defaultNamespace) 
at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace) 
at System.Xml.Serialization.XmlSerializer..ctor(Type type) 
+0

.Net 4.0シリアライズファイルを読み込む.Net 2.0アプリケーションに影響しますか? –

+0

あなたはWindowsの検索..を行う場合、そのdllを見つけることができますか?もしそれがGACであったり、プロジェクトでcopylocalプロパティがtrueに設定されていれば、それを現在どのように参照しているかわかりません。2.0と4.0のGACは共有されていません。彼らは独自のGACを持っていますFY12 – MethodMan

+0

VMがIOバインドされているときに発生しますか?はいの場合、私は前にこれを見てきました。いいえ、治療法はありませんが、回避策 - このディスク上のファイルを強制的にフラッシュし、1ms待ってください。 –

答えて

1

私は、ASP.NETとほぼ同じ問題を抱えていました。その理由は、そのフォルダに書き込まれた一時DLLは、おそらく他の一時DLLからの参照でどこかに記憶されているからです。

解決方法は、C:\Documents and Settings\user\Local Settings\Tempフォルダー内のすべてのファイルを削除することです。それらのうちのいくつかはロックされる可能性が高く、ロックされたファイルは(私の経験から)問題の原因である可能性が高いため、少々の反復でファイルを削除する必要があります。一時フォルダがクリアされていると、すべてのものが意図したとおりに動作します(少なくとも私にとっては)。

+0

一時フォルダをクリーンアップしようとしましたが、それでも同じ問題がありました。この問題は、csc.exeが実行時にtemp .csファイルをアセンブリに変換するのに失敗したように見えますが、これは散発的です。 – Loathian

0

MicrosoftのXMLシリアライザは、それ自体が非常に悪いです。あなたが得る例外は、新しいXMLシリアライザを作成するたびに.NETが即座にアセンブリを生成するためです。これをできるだけ避けるには、直列化しようとしている型のキーとXMLシリアライザを値として持つ辞書を実装します。このようなキャッシングを使用すると、最初に不明な型をシリアル化するときに初めてこの例外が発生する可能性があります。

マイクロソフトのMSDN Webサイトをご覧ください。XmlSerializer Class私が今言ったことを伝えてくれる段落があります。

関連する問題