Recientemente hemos empezado a ver FileNotFoundException
lanzados esporádicamente mientras se deserializa XML. El mensaje es que no se puede encontrar el ensamblaje temporal utilizado para asignar el código XML al código. Desde el documento this parece que esto puede suceder cuando el Framework .NET no puede crear este archivo (sin embargo, la razón por la cual no se captura, incluso en la excepción interna).FileNotFoundException al deserializar XML
Aquí es la excepción:
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'.
El nombre del archivo es diferente en cada error, pero el error es siempre el mismo, que se origina a partir de aquí (pila de llamadas completa en la parte inferior):
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)
Cuando el CSharpCodeGenerator
intenta generar el ensamblaje. Hemos estado utilizando este código en producción durante años y ha sido muy estable. Simplemente comenzó a fallar en la última semana más o menos. Nos hemos preguntado si podría tener algo que ver con la última versión Microsoft security patch, ya que afecta a la versión de nuestro código en .NET 2.0 y .NET 4.0 en múltiples sistemas operativos (XP y Server 2003).
El error es esporádico y ejecutar el proceso de nuevo generalmente hace que desaparezca. Esta es una aplicación de línea de comando de un solo subproceso que recupera archivos y los inserta en una base de datos.
No he podido encontrar a nadie más con el mismo problema, pero no está aislado en la misma línea de código, tenemos un par de lugares que usan el código System.Xml.Serialization
y hemos visto este error de cada. Este código tampoco es algo que hayamos cambiado recientemente.
La otra publicación más cercana que puedo encontrar es this una.
En nuestra QA VM no hay un antivirus, así que no creo que sea un problema. También hemos visto este problema tanto en nuestro entorno alojado como en un sitio de cliente separado.
Hemos tratado:
- La limpieza de este directorio temporal
- permisos comprobando en el directorio temporal (el usuario es administrador local en la caja)
- Generación de XmlSerializers.dll mediante el uso y la implementación de sgen.exe a la carpeta de la aplicación (el problema persiste como si .NET Framework no quisiera usar estos ensamblajes).
Si alguien tiene alguna idea o sugerencia que pueda ser útil.
pila de llamadas completa:
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)
¿Afecta una aplicación .Net 2.0 al leer un archivo serializado .Net 4.0? –
¿Puede encontrar eso .dll si hace una búsqueda de Windows ...? y si es así, puede ser GAC o la propiedad copylocal establecida como verdadera en el (los) proyecto (s) no está seguro de cómo la está haciendo referencia actualmente. GAC para 2.0 y 4.0 no se comparten; tienen su propio GAC FYI – MethodMan
. suceder, cuando la VM está vinculada a IO? En caso afirmativo, he visto esto antes: no hay cura, sino una solución alternativa: fuerce el enjuague de algunos archivos en este disco y espere 1 ms. –