【问题标题】:Crash Instantiating System.Xml.Serialization.XmlSerializer in C#在 C# 中实例化 System.Xml.Serialization.XmlSerializer 时崩溃
【发布时间】:2010-09-08 15:23:07
【问题描述】:

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

【问题讨论】:

    标签: c# .net serialization


    【解决方案1】:

    找到这个链接,它解释了这个问题: http://social.msdn.microsoft.com/forums/en-US/asmxandxml/thread/4476f044-bab9-492d-bb94-4e0960bd2d26

    快速总结:当序列化时,对象从所有环境变量中创建一个字典,但似乎对所有条目运行 ToLower()。所以,如果你有两个除了大小写之外都相同的环境变量,你就会崩溃。

    只有在像 cygwin 这样强制变量区分大小写的系统内部运行时,这才会成为问题。在我们的例子中,我们使用的是 make。

    有几个解决方案,但它们都围绕着确保您的环境在您的 c# 应用程序运行时没有任何重复的变量。

    【讨论】:

    • 我遇到了完全相同的问题(也来自 Cygwin 内部),所以您的回答非常有帮助!
    • 很高兴能为您节省一些时间。我用头撞墙了一会儿,试图弄清楚这一点。
    • 此错误已在 .Net 运行时的最新版本中修复,对于 4.0 和 4.7 之间的某些“最近”值。它仍然存在于 2.0-3.5 运行时中。
    猜你喜欢
    • 2019-03-29
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 2017-02-11
    相关资源
    最近更新 更多