2008-09-11 2 views
1

C# 라이브러리에서 System.Xml.Serialization.XmlSerializer 클래스의 인스턴스를 인스턴스화 할 때 크래시가 발생합니다. 충돌은 사전에 중복 키를 추가하려고 할 때 생성자에서 발생합니다. 아래에 스택 추적을 포함했습니다.C#에서 System.Xml.Serialization.XmlSerializer를 인스턴스화하는 크래시

이 충돌은 한 컴퓨터에서만 발생하며 .NET 3.5 설치를 복구하는 데 도움이되지 않았습니다. 비슷한 문제가있는 사람이 있습니까? 문제를 설명하고이 링크를 찾을 수

System.ArgumentException was unhandled 
    Message="Item has already been added. Key in dictionary: 'mainbuild' Key being added: 'mainbuild'" 
    Source="mscorlib" 
    StackTrace: 
     at System.Collections.Hashtable.Insert(Object key, Object nvalue, Boolean add) 
     at System.Collections.Hashtable.Add(Object key, Object value) 
     at System.Collections.Specialized.StringDictionary.Add(String key, String value) 
     at System.CodeDom.Compiler.Executor.ExecWaitWithCaptureUnimpersonated(SafeUserTokenHandle userToken, String cmd, String currentDir, TempFileCollection tempFiles, String& outputName, String& errorName, String trueCmdLine) 
     at System.CodeDom.Compiler.Executor.ExecWaitWithCapture(SafeUserTokenHandle userToken, String cmd, String currentDir, TempFileCollection tempFiles, String& outputName, String& errorName, String trueCmdLine) 
     at Microsoft.CSharp.CSharpCodeGenerator.Compile(CompilerParameters options, String compilerDirectory, String compilerExe, String arguments, String& outputFile, Int32& nativeReturnValue, String trueArgs) 
     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) 
     at OurTools.Tools.Common.XML.DataAccess`1.DeserializeFromXml(String strFilePath) in c:\AutomatedBuild\projects\1.0\OurTools.Tools.Common\OurTools.Tools.Common\XML\DataAcess.cs:line 100 
     at OurTools.Tools.Common.ProjectFileManager.GetProjectInfoModel() in c:\AutomatedBuild\projects\1.0\OurTools.Tools.Common\OurTools.Tools.Common\ProjectFileManager.cs:line 252 
     at OurTools.Tools.Common.ProjectFileManager.GetAvailableCultures() in c:\AutomatedBuild\projects\1.0\OurTools.Tools.Common\OurTools.Tools.Common\ProjectFileManager.cs:line 299 
     at OurAppLib.GeneratorOptions.DefaultCultures() in c:\AutomatedBuild\projects\1.0\OurApp\OurAppLib\GeneratorOptions.cs:line 192 
     at OurAppLib.GeneratorOptions.ReadCulturesFromArgs(List`1 arglist, String& errormsg) in c:\AutomatedBuild\projects\1.0\OurApp\OurAppLib\GeneratorOptions.cs:line 358 
     at OurAppLib.GeneratorOptions.ReadFromArgs(String[] args, String& errormsg) in c:\AutomatedBuild\projects\1.0\OurApp\OurAppLib\GeneratorOptions.cs:line 261 
     at OurApp.Program.Main(String[] args) in c:\AutomatedBuild\projects\1.0\OurApp\OurApp\Program.cs:line 76`print("code sample");` 

답변

5

: http://social.msdn.microsoft.com/forums/en-US/asmxandxml/thread/4476f044-bab9-492d-bb94-4e0960bd2d26

빠른 요약 : 직렬화하면 객체가 모든 환경 변수 중 사전을 만들지 만, 모두에 ToLower는()를 실행 나타납니다 항목. 따라서 케이싱을 제외하고 두 개의 환경 변수가 같으면 충돌이 발생합니다.

이것은 cygwin과 같이 변수에 대소 문자를 구분하는 시스템 내부에서 실행될 때만 문제가 될 것입니다. 여기서는 make를 사용합니다.

몇 가지 솔루션이 있지만 모두 C# 응용 프로그램을 실행할 때 자신의 환경에 중복 된 변수가 없는지 확인해야합니다.

+1

Cygwin에서 나온 것과 똑같은 문제가 있었기 때문에 답변이 매우 유용했습니다! – mmmmmmmm

+0

다행입니다. 시간을 절약 할 수있었습니다. 나는 벽에 머리를 대고 잠시 동안이 것을 알아 내려고 노력했다. – tsellon

+0

이 버그는 4.0과 4.7 사이의 "최근"값의 일부인 .Net 런타임의 최신 버전에서 수정되었습니다. 2.0-3.5 런타임에는 여전히 존재합니다. – RichieHindle