2012-01-06 2 views
11

XML을 비 직렬화하는 동안 최근에 FileNotFoundException이 산발적으로 발생하는 것을보기 시작했습니다. 메시지는 XML에서 코드로 매핑하는 데 사용 된 임시 어셈블리를 찾을 수 없다는 메시지입니다. this 문서에서 .NET Framework에서이 파일을 만들 수 없을 때 발생할 수있는 것처럼 보입니다 (그러나 내부 예외에서도 캡처되지 않은 이유가 있음). 여기 FileNotFoundException XML 역 직렬화시

는 예외입니다 :

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의 코드 버전에 영향을 미치기 때문입니다.

오류가 산발적이어서 프로세스를 다시 실행하면 보통 사라집니다. 이것은 파일을 검색하여 데이터베이스에 삽입하는 단일 스레드 명령 행 응용 프로그램입니다.

동일한 문제가있는 다른 사용자를 찾을 수는 없지만 같은 코드 줄에 격리되어 있지 않은 경우 System.Xml.Serialization 코드를 사용하는 두 곳의 장소가 있는데이 오류가 발생했습니다 각각에서. 이 코드는 우리가 최근에 변경 한 것이 아닙니다.

찾을 수있는 가장 가까운 다른 게시물은 this입니다.

QA VM에는 바이러스 스캐너가 없으므로 문제가되지 않는다고 생각합니다. 또한 호스팅 환경과 별도의 고객 사이트에서이 문제를 보았습니다.

우리는 시도 :

  1. 이 임시 디렉토리 임시 디렉토리에
  2. 검사 권한을
  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가 있습니다. – MethodMan

+0

이 작업을 수행합니까? VM이 IO 바인딩 될 때 발생합니까? 예인 경우, 전에 본 적이 있습니다. 치료할 수는 없지만 해결 방법 -이 디스크의 일부 파일을 강제로 플러시하고 1ms 동안 기다리십시오. –

답변

1

내가 ASP.NET과 거의 같은 문제가 있었다. 그 이유는 해당 폴더에 작성된 임시 DLL이 다른 임시 DLL의 참조에서 어딘가에 기억 될 수 있기 때문입니다.

해결책은 C:\Documents and Settings\user\Local Settings\Temp 폴더의 모든 파일을 삭제하는 것입니다. 그 중 일부는 잠기고 잠긴 파일은 문제의 원인 일 가능성이 큽니다 (경험상). 몇 번 반복하면 파일을 삭제해야합니다. 임시 폴더가 지워졌을 때, 모든 것이 의도 한대로 작동합니다 (적어도 나를 위해).

+0

임시 폴더를 정리했지만 여전히 동일한 문제가있었습니다. 이 문제는 csc.exe가 런타임에 임시 .cs 파일을 어셈블리로 변환하는 데 실패한 것처럼 보입니다. 그러나 이는 산발적입니다. – Loathian

0

Microsoft의 XML serializer는 그 자체로 매우 나쁨입니다..NET은 새 XML serializer를 만들 때마다 즉시 어셈블리를 생성하기 때문에 예외가 발생합니다. 이 문제를 최대한 방지하려면 serialize하려는 유형의 키와 XML serializer를 값으로 사용하여 사전을 구현하십시오. 이러한 종류의 캐싱을 사용하면 알 수없는 유형을 처음으로 serialize 할 때만이 첫 번째 예외가 발생할 수 있습니다.

Microsoft의 MSDN 웹 사이트, XmlSerializer Class을 살펴보십시오. 방금 말한 것을 말해주는 단락이 있습니다.