2008-09-11 8 views
1

Beim Instanziieren einer Instanz der System.Xml.Serialization.XmlSerializer-Klasse in einer C# -Bibliothek tritt ein Absturz auf. Der Absturz tritt im Konstruktor auf, wenn versucht wird, einem Wörterbuch einen doppelten Schlüssel hinzuzufügen. Ich habe unten eine Stapelverfolgung eingefügt.Crash-Instanziierung von System.Xml.Serialization.XmlSerializer in C#

Dieser Absturz tritt nur auf einer Maschine auf, und die Reparatur unserer Installation von .NET 3.5 hat nicht geholfen. Hat noch jemand ähnliche Probleme gesehen?

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

Antwort

5

diesen Link gefunden, die das Problem erläutert: http://social.msdn.microsoft.com/forums/en-US/asmxandxml/thread/4476f044-bab9-492d-bb94-4e0960bd2d26

Eine kurze Zusammenfassung: Wenn die Serialisierung, macht die Aufgabe, ein Wörterbuch aus allen Umgebungsvariablen, scheint aber eine ToLower() auf alle laufen Einträge. Wenn Sie also zwei Umgebungsvariablen haben, die bis auf das Gehäuse identisch sind, erhalten Sie einen Absturz.

Dies wird nur ein Problem sein, wenn Sie innerhalb eines Systems wie cygwin laufen, das Groß-und Kleinschreibung für Variablen erzwingt. In unserem Fall verwenden wir make.

Es gibt ein paar Lösungen, aber alle drehen sich darum, sicherzustellen, dass Ihre Umgebung keine doppelten Variablen hat, wenn Ihre C# -App ausgeführt wird.

+1

Ich hatte genau das gleiche Problem (auch von Cygwin), also war Ihre Antwort SEHR hilfreich! – mmmmmmmm

+0

Froh ich könnte dir etwas Zeit sparen. Ich schlug meinen Kopf eine Weile gegen die Wand und versuchte, diese herauszufinden. – tsellon

+0

Dieser Fehler wurde in einer aktuellen Version der .NET-Laufzeit für einen Wert von "zuletzt" zwischen 4.0 und 4.7 behoben. Es existiert noch in der Laufzeit 2.0-3.5. – RichieHindle