【问题标题】:OutOfMemoryException on application load应用程序加载时出现 OutOfMemoryException
【发布时间】:2018-11-19 11:57:13
【问题描述】:

这个错误快把我逼疯了。我有这个用 c# 制作的应用程序,几天前它运行良好,但自从我安装了 .net 本机预览后,它就作为后台进程启动并一直运行,直到它到达:MainWindow mainWindow = new MainWindow();那是它停止执行代码的时候......几秒钟后它从任务管理器中消失并将其写入事件日志:

Faulting application name: CryptoLight.exe, version: 1.0.0.0, time stamp: 0x54233e4c Faulting module name: KERNELBASE.dll, version: 6.3.9600.17055, time stamp: 0x532943a3 Exception code: 0xe0434352 Fault offset: 0x00011d4d Faulting process ID: 0xce8 Faulting application start time: 0x01cfd8428be7903d Faulting application path: C:\Users\<Name>\Documents\Visual Studio 2013\Projects\CompleteCryptography\CompleteCryptography\bin\Release\CryptoLight.exe Faulting module path: C:\WINDOWS\SYSTEM32\KERNELBASE.dll Report ID: cf371a9b-4435-11e4-bef6-6894233c343e Faulting package full name: Faulting package-relative application ID:

或者这个:

Application: CryptoLight.exe Framework Version: v4.0.30319 Description: The process was terminated due to an unhandled exception. Exception Info: System.OutOfMemoryException Stack: at MS.Internal.Resources.ResourceManagerWrapper.GetStream(System.String) at MS.Internal.AppModel.ResourcePart.EnsureResourceLocationSet() at MS.Internal.AppModel.ResourcePart.GetContentTypeCore() at System.IO.Packaging.PackagePart.get_ContentType() at System.Windows.Application.LoadComponent(System.Object, System.Uri) at CryptoLight.MainWindow.InitializeComponent() at CryptoLight.App.App_Startup(System.Object, System.Windows.StartupEventArgs) at System.Windows.Application.OnStartup(System.Windows.StartupEventArgs) at System.Windows.Application.<.ctor>b__1(System.Object) at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32) at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)

今天早些时候(我第一次遇到这个问题)我在启动应用程序时收到了一个Fatal CLR Error: 80004005,我想我已经通过删除重复的 .net 安装来修复它,但是这个问题在那之后就开始了..

编辑: 经过更多调试后,我终于找到了导致此错误的代码行:InitializeComponent(); in MainWindow()。为什么InitializeComponent(); 导致OutOfMemoryException,当我的应用程序仅使用 45 - 50 mb 并且我在 64 位 pc 上的 4 gb 中有大约 3 gb ram 空闲时,我得到了这个异常

【问题讨论】:

  • 听起来像是递归方法调用。
  • @B.K.我的应用程序今天早些时候运行良好。而且我也没有修改代码
  • at MS.Internal.Resources.ResourceManagerWrapper.GetStream(System.String) 应用程序是否正在尝试加载大型资源?另外,调试时是否向应用程序传递任何参数?这可能解释了在 Visual Studio 中调试和直接从发布文件夹运行它之间的区别。
  • @IlianPinzon 现在无论是否使用 Visual Studio 都会引发错误..
  • @IlianPinzon 我试过带参数和不带参数,除了主窗口本身之外,我的应用不会加载任何东西

标签: c# .net wpf


【解决方案1】:

对不起,我只能给你一个提示,没有完整的内容。我写它作为答案,因为它很长,不适合 cmets。但仍然可能有帮助..

事实:除了极少数情况外,许多 .Net 版本可以在单个系统上共存。如果安装新版本的框架会破坏您的应用 - 这可能意味着您的应用已“打开以供更新”并且它选择了最新的框架,而不是坚持使用它构建的框架。 p>

提示 #1:您可以创建一个“清单”文件(即 app.exe.manifest),并在其中声明允许使用哪些框架版本。因此,即在具有 Net4 的系统上,您可以强制应用程序在 Net2.0 级别上运行。我无法为您提供语法.. 但在互联网上很容易找到。

提示 #2:在非常黑暗的情况下,您可以启用启动前日志记录。 .Net 使用“Fusion 引擎”来确定应该使用哪些框架 DLL,并且该引擎在应用程序实际运行之前被触发。 Fusion 检查系统中的内容,检查应用程序的要求(即清单)并尝试将所有内容绑定在一起。您可以打开“融合日志记录”,然后运行应用程序,然后关闭日志记录并检查日志以了解为您的程序集选择了哪些 DLL。如果选择了错误的并且您不知道为什么会有所帮助。只是不要忘记关闭日志记录,因为它会减慢所有 .Net 应用程序的启动速度:)

【讨论】:

    【解决方案2】:

    这是 Windows 附带的 .net 框架的问题,我认为 .net 本机预览版搞砸了。系统还原解决了问题

    【讨论】:

      【解决方案3】:

      您是否安装了 Visual Studio for .NET Native Preview?我认为它带有最新的 CLR。我们可能不小心在该 CLR 中引入了回归。请在 Microsoft Connect 上提交错误并将其链接发送给我 (karel.zikmund@you-know-where.com)。

      请在您的错误报告中提供您的 clr.dll 版本:

      filever /v %WINDIR%\Microsoft.NET\Framework\v4.0.30319\clr.dll (grab the FileVersion string)
      

      另外,请在错误中添加应用程序崩溃的转储(附加 VS 作为本机调试器)。

      -Karel Zikmund(CLR /.NET Native 可靠性团队的开发人员)

      【讨论】:

        猜你喜欢
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 2015-01-07
        • 2022-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多