2008-09-11 9 views
1

Nous assistons à un blocage lors de l'instanciation d'une instance de la classe System.Xml.Serialization.XmlSerializer dans une bibliothèque C#. Le blocage se produit dans le constructeur, lorsqu'il essaie d'ajouter une clé dupliquée à un dictionnaire. J'ai inclus une trace de pile ci-dessous.Crash Instanciation System.Xml.Serialization.XmlSerializer en C#

Cet incident se produit uniquement sur une machine, et la réparation de notre installation de .NET 3.5 n'a pas aidé. Quelqu'un d'autre a-t-il déjà vu des problèmes similaires?

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");` 

Répondre

5

trouvé ce lien, ce qui explique la question: http://social.msdn.microsoft.com/forums/en-US/asmxandxml/thread/4476f044-bab9-492d-bb94-4e0960bd2d26

Un résumé rapide: Lors de la sérialisation, l'objet fait un dictionnaire de toutes les variables d'environnement, mais il semble courir un ToLower() sur tous les Entrées Donc, si vous avez deux variables d'environnement qui sont identiques à l'exception de l'enveloppe, vous aurez un plantage.

Cela ne va être un problème lors de l'exécution à partir d'un système comme cygwin qui applique la sensibilité à la casse pour les variables. Dans notre cas, nous utilisons make.

Il existe plusieurs solutions, mais elles s'articulent toutes autour de l'absence de variables dupliquées dans votre environnement lors de l'exécution de votre application C#.

+1

J'ai eu exactement le même problème (également à partir de Cygwin), donc votre réponse a été TRES utile! – mmmmmmmm

+0

Je suis heureux de vous avoir permis de gagner du temps. Je me cognais la tête contre le mur pendant un moment en essayant de comprendre celui-ci. – tsellon

+0

Ce bug a été corrigé dans une version récente de l'environnement d'exécution .Net, pour une valeur de "récente" entre 4.0 et 4.7. Il existe toujours dans le runtime 2.0-3.5. – RichieHindle