【问题标题】:CS2000: Compiler initialization failed unexpectedlyCS2000:编译器初始化意外失败
【发布时间】:2010-10-29 14:35:15
【问题描述】:

我有一个 WPF .NET 3.5 SP1 应用程序,目前至少有数百台(如果不是数千台)机器正在使用它。应用程序在启动时加载的 XML 中存储一个树结构。当我尝试通过序列化加载 xml 时,轰隆隆。它只发生在一台最终用户机器上。他拥有管理员权限、充足的磁盘空间、内存等。

在我将其视为机器问题或防病毒/间谍软件并让他的 IT 部门参与(一个艰苦的过程)之前,我想看看是否有更好的方法来追踪它并获取更多信息。由于 XmlSerialization 是黑盒式的,我不确定作为开发人员我还能做更多的事情。或者我可以吗?

感谢任何提示,以下是完整的错误。

无法生成临时类 (结果=1)。错误 CS2000:编译器 初始化意外失败—— '没有足够的存储空间可用于 完成此操作。 '

Stack Trace: 

   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 Internal.Objects.TreeSetItemManager.LoadTreeItems(String fileName) in TreeSetItemManager.cs:line 41
   at SPA.Windows.MasterWindow.OnInitialized(EventArgs e)
5/28/2009 10:16:20 Message:
External component has thrown an exception.Details:
   at MS.Win32.UnsafeNativeMethods.ITfThreadMgr.Activate(Int32& clientId)
   at System.Windows.Input.TextServicesContext.RegisterTextStore(DefaultTextStore defaultTextStore)
   at System.Windows.Input.DefaultTextStore.get_Current()
   at System.Windows.Input.TextServicesContext.SetFocusOnDefaultTextStore()
   at System.Windows.Input.InputMethod.EnableOrDisableInputMethod(Boolean bEnabled)
   at System.Windows.Input.TextServicesManager.Focus(DependencyObject focus)
   at System.Windows.Input.KeyboardDevice.ChangeFocus(DependencyObject focus, Int32 timestamp)
   at System.Windows.Input.KeyboardDevice.TryChangeFocus(DependencyObject newFocus, IKeyboardInputProvider keyboardInputProvider, Boolean askOld, Boolean askNew, Boolean forceToNullIfFailed)
   at System.Windows.Input.KeyboardDevice.Focus(DependencyObject focus, Boolean askOld, Boolean askNew)
   at System.Windows.Input.KeyboardDevice.Focus(IInputElement element)
   at System.Windows.Interop.HwndKeyboardInputProvider.FilterMessage(IntPtr hwnd, Int32 message, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)

【问题讨论】:

    标签: wpf .net-3.5 xml-serialization


    【解决方案1】:

    即使他有管理员权限,%TEMP% 指向那台机器的哪个位置?您可以在其中手动创建/删除文件吗?

    其次,与后续机器相比,故障机器中有多少内存?

    【讨论】:

    • +1 对于第一个建议,我之前无数次遇到临时文件夹权限问题..
    • 是的,在发布之前检查了 temp,明确地给了他完整的管理员权限。两台机器的可用内存约为 1GB。
    【解决方案2】:

    提示:我们在使用 .NET 编译转换的 XSLT 中遇到了类似的 msxsl:script 标记问题。注意你报的错误发生在序列化器的compile方法中。

    您已经检查了磁盘空间和权限,但进程用户可能不是管理员,例如 asp.net 进程。

    警告:Microsoft .NET XslCompiledTransform 类在使用 msxsl:script 时会导致几个问题。 XslCompiledTransform 在临时文件夹中创建一个 DLL 并将其锁定在内存中。

    1. ASP.NET 进程可能无法访问临时文件夹,XSLT 将失败。
    2. 临时 DLL 不是临时的,而是保留在文件夹中:每个使用 msxsl:script 的转换都有一个 DLL。最终,服务器的硬盘驱动器被填满。
    3. DLL 被锁定在内存中,导致严重的内存泄漏。

    不要将 msxsl:script 与 Microsoft .NET XslCompiledTransform 类一起使用。相反,使用扩展对象在 XSLT 之外调用 C# 或 VB.NET 方法。请参阅 Microsoft 在 XSLT Extension Objects 上的文档。

    (http://dev.ektron.com/kb_article.aspx?id=482)

    【讨论】:

    • 用户是管理员,对临时文件夹具有管理员权限。这不是 ASP.NET,而是 WPF。
    • XslTransform 与该问题无关...尝试生成临时序列化程序集时失败
    • 谢谢 - 我正在使用来自 msxsl:script 的 XslCompiledTransform - DOH!
    【解决方案3】:

    您可以尝试预先生成 XML 序列化程序集(使用 sgen.exe 或使用项目属性的“构建”窗格中的选项)并将它们与您的应用程序一起发布。这样,它们就不需要在运行时生成,也不会出现异常

    【讨论】:

    • 我喜欢这个主意。您指的是“生成序列化程序集”设置,我将其设置为“开”,对吗?我会在星期一尝试并把它交给最终用户,看看会发生什么。谢谢。
    • 是的,这就是我要说的。额外的好处:它会更快;)
    • 我当然认为你有它,但没有运气。他仍然得到同样的错误。这很烦人。我希望这周能和他们的 IT 人员开会。我强烈怀疑是 AV 或其他一些软件妨碍了我。我只是希望在将其归结为某些系统异常之前,我可以进行一些进一步的调试和信息收集。
    • 没有真正的解决方案,但显然我必须接受答案。我仍然怀疑这是他们环境中的某些东西。我很欣赏所有的回应,但必须只选择一个。 ://
    【解决方案4】:

    鉴于错误消息指出“没有足够的存储空间来完成此操作。”,我猜问题不是因为具有 XML 文件的位置空间不足或没有权限。我的猜测是,临时程序集的中间文件被丢弃的临时位置实际上是导致问题的原因。

    .NET 中的 XmlSerialization 使用代码生成来创建 C# 源代码,然后对其进行编译(最终使用 CSharpCodeProvider,它是 CodeDom 的一部分。)CodeDom 编译源代码与命令行 csc.exe 编译器非常相似,因此是临时中间在生成最终程序集之前,通常需要在磁盘上创建目标文件(无论它是否是内存中的程序集。)

    我会弄清楚这些临时文件的放置位置,并确保驱动器有足够的空间。确保有问题的用户在生成这些临时文件的地方也没有任何类型的空间配额,就好像他已经使用了他的配额一样,这也可能导致存储空间异常。这些文件的临时位置可通过应用程序 .config 文件中的 XmlSerializerSection 进行配置,因此如果确实存在空间问题,您可以尝试将它们临时重定向到有足够空间的驱动器(以及读取/写入/删除权限)当前用户。)

    【讨论】:

      【解决方案5】:

      一些调查表明,通过“存储”,系统指的是进程的内存,而不是磁盘空间。

      鉴于 XmlSerializer 将从 C# 代码在内存中创建程序集,看起来这可能是一个开始的地方。一些需要调查的事情可能包括:

      • XML 对象图是否很大? (我承认,如果是问题所在的序列化而不是反序列化,这更有可能是一个问题......)
      • 此工作站的内存配置有什么异常吗?是否有许多其他进程正在运行、没有剩余的虚拟内存或其他异常压力?

      无论如何,+1 建议预编译 XML,如果这是必须要走的预设配置样式数据。

      【讨论】:

      • 文件很小,大概20K左右。
      【解决方案6】:

      this MSDN article 表示您应该修复或重新安装 .NET Framework SDK。你可以试试看是否有帮助?

      【讨论】:

      • 我会尝试任何事情。呵呵。但是,它发生在一个组织内的每个人身上。所以我仍然怀疑这是他们环境中的东西。不幸的是,我必须在接下来的一个小时左右内接受答案。我不知道是哪一个。有很多合理的建议,但没有一个能解决问题。所以,hrm。
      【解决方案7】:

      更新。

      问题最终是与 Cisco 的安全代理软件冲突以及 Xenocode 执行的混淆。如果从等式中删除其中一个或另一个,则不会发生异常。我也尝试了很多方法来解决它,但无济于事。因此,我对 Xenocode 进行了查询(与 Cisco 的交流完全是浪费时间)。也许他们可以查明到底发生了什么。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-25
        • 2016-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-13
        • 1970-01-01
        相关资源
        最近更新 更多