最近我们在反序列化XML时发现偶尔会抛出FileNotFoundException异常。错误信息为无法找到用于从XML到代码映射的临时程序集。从this文档中可以看出,当.NET Framework无法创建此文件时,就会发生这种情况(但即使在内部异常中也没有捕获原因)。以下是异常信息:
文件名在每个错误中都不同,但错误始终相同,它起源于这里(完整的调用堆栈在底部):
当
这个错误是不规律的,再次运行该进程通常会使其消失。这是一个单线程命令行应用程序,它检索文件并将它们插入到数据库中。
我没有找到其他遇到同样问题的人,但这并不是只有同一行代码才会出现的问题,我们有几个地方使用了
我能找到的最接近的帖子是this。
在我们的QA VM上没有病毒扫描程序,所以我认为这不是问题所在。我们还在我们托管的环境和另一个客户站点中看到了这个问题。
我们尝试过:
1. 清理此临时目录 2. 检查临时目录的权限(用户是本地管理员) 3. 通过使用sgen.exe生成XmlSerializers.dll并将其部署到应用程序文件夹中(问题仍然存在,好像.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'.
文件名在每个错误中都不同,但错误始终相同,它起源于这里(完整的调用堆栈在底部):
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安全补丁有关,因为它影响了我们在多个操作系统(XP和Server 2003)上的.NET 2.0和.NET 4.0版本的代码。这个错误是不规律的,再次运行该进程通常会使其消失。这是一个单线程命令行应用程序,它检索文件并将它们插入到数据库中。
我没有找到其他遇到同样问题的人,但这并不是只有同一行代码才会出现的问题,我们有几个地方使用了
System.Xml.Serialization
代码,并且我们从每个地方都看到了这个错误。这段代码也不是我们最近更改过的。我能找到的最接近的帖子是this。
在我们的QA VM上没有病毒扫描程序,所以我认为这不是问题所在。我们还在我们托管的环境和另一个客户站点中看到了这个问题。
我们尝试过:
1. 清理此临时目录 2. 检查临时目录的权限(用户是本地管理员) 3. 通过使用sgen.exe生成XmlSerializers.dll并将其部署到应用程序文件夹中(问题仍然存在,好像.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)