代码之家  ›  专栏  ›  技术社区  ›  billb

CS2000:编译器初始化意外失败

  •  1
  • billb  · 技术社区  · 15 年前

    我有一个wpf.net 3.5sp1应用程序,目前至少在数百台(如果不是数千台)计算机上使用。应用程序以XML形式存储启动时加载的树结构。当我尝试通过序列化加载XML时,就开始了。它只发生在一个终端用户机器上。他有管理权,有足够的磁盘空间、内存等。

    在我将其视为机器问题或反病毒/间谍软件并让他的IT部门参与进来(一个艰苦的过程)之前,我想看看是否有更好的方法来跟踪这个问题并获取更多信息。因为XML序列化是黑盒的,我不确定作为一个开发人员还有更多的工作要做。或者我可以吗?

    如有任何提示,请参阅下面的完整错误。

    无法生成临时类 (结果=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)
    
    7 回复  |  直到 15 年前
        1
  •  1
  •   blowdart    15 年前

    即使他有管理员权限,那台机器上的%temp%指向哪里?你能在那里手动创建/删除文件吗?

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

        2
  •  1
  •   Thomas Levesque    15 年前

    您可以尝试预生成XML序列化程序集(使用sgen.exe或使用项目属性的“生成”窗格中的选项),然后使用应用程序释放它们。这样,它们就不需要在运行时生成,而且您也不会得到那个异常。

        3
  •  1
  •   RCIX    15 年前

    this MSDN article 建议您修复或重新安装.NET Framework SDK。你能试试看有没有帮助吗?

        4
  •  1
  •   billb    15 年前

    更新。

    问题最终与Cisco的安全代理软件发生冲突,并由Xenocode执行模糊处理。如果从方程中删除一个或另一个,则不会发生异常。我也尝试过很多方法来解决这个问题,但都无济于事。所以我有一个关于Xenocode的查询(与Cisco的通信是浪费时间之外的)。也许他们能了解到底发生了什么。

        5
  •  0
  •   Doug Domeny    15 年前

    提示:在使用.NET编译转换的XSLT中,msxsl:script标记也有类似的问题。请注意,您报告的错误发生在序列化程序的编译方法中。

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

    警告:使用msxsl:script时,Microsoft.NET XSLCompiledTransform类会导致几个问题。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 )

        6
  •  0
  •   jrista    15 年前

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

    .NET中的XML序列化使用代码生成来创建C源代码,然后编译wich(最终使用CSharpCodeProvider,它是codedom的一部分)。codedom编译源代码与命令行csc.exe编译器非常相似,因此在生成最终程序集之前,通常需要在磁盘上创建临时中间对象文件。操作(不管它是否为内存中的程序集。)

    我会找出这些临时文件放在哪里,并确保驱动器有足够的空间。确保有问题的用户没有任何类型的空间配额,这些临时文件也在其中生成,就像他使用了自己的配额一样,这也可能导致存储空间异常。这些文件的临时位置可以通过applications.config文件中的xmlserializersection进行配置,因此如果确实存在空间问题,可以尝试将它们临时重定向到具有足够空间的驱动器(以及当前用户的读/写/删除权限)。

        7
  •  0
  •   Jeremy McGee    15 年前

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

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

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

    在任何情况下,+1表示对XML进行预编译的建议,如果这是预先设置好的配置样式数据,则必须这样做。