C# WPF 应用程序在发布模式下失控,但不是调试模式

Posted

技术标签:

【中文标题】C# WPF 应用程序在发布模式下失控,但不是调试模式【英文标题】:C# WPF Application go haywire in Release Mode but not Debug Mode 【发布时间】:2014-02-27 09:11:57 【问题描述】:

据我了解,如果没记错的话,release 模式编译时应该有更多的优化,因此体积会更小。

我正在开发一个 WPF C# 应用程序,当我选择 Release mode 时,我的应用程序出现问题,但它在 Debug mode 中运行良好。我可以知道它甚至可能吗?发生这种情况的最常见因素是什么?

更新: 当应用程序加载时,登录后的登陆页面将显示从数据库中检索到的信息。在debug mode 中时,信息会按预期显示。但在Release mode 中,信息不显示

数据库连接没有问题,因为如果有,用户根本无法登录。

很抱歉,由于项目太大,我无法分享任何代码。我期待更多关于Release modeDebug mode 之间的一般理解,并找出我所面临情况的可能原因。任何帮助将不胜感激。

【问题讨论】:

也许您可以更准确地定义“乱线”? @Richard:很抱歉信息不足,请查看我更新的问题。非常感谢 一些开始诊断的地方:您是否有任何命令行参数在构建配置之间有所不同?您是否定义了在构建配置之间不同的编译符号?你使用了很多#if DEBUG吗?不同构建配置的目标处理器架构是否不同。 【参考方案1】:

这里最大的问题是 Debug 和 Release 只是项目中特定配置的占位符。您实际上可以逐个项目更改它们的含义。

但默认情况下,差异实际上相当小。 Click for large image

这意味着您可以使用配置管理器(在解决方案资源管理器中右键单击解决方案)来获取您的 Debug 配置,并基于它创建一个新配置,然后慢慢更改这些属性,以便您可以找到问题其实是。

一个经常被误解的技巧是您仍然可以调试发布程序集(即使在优化之后)。因此,您应该能够更好地了解正在发生的事情,然后再次提出您的问题。

【讨论】:

【参考方案2】:

如果你使用 MVVM Light 有两种不同的模式:

    static ViewModelLocator()
    
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

        if (ViewModelBase.IsInDesignModeStatic)
        
            SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
        
        else
        
            SimpleIoc.Default.Register<IDataService, DataService>();
        

        SimpleIoc.Default.Register<MainWindowViewModel>();
    

SimpleIoc.Default.Register fails at IsInDesignModeStatic if the Interface is in different assembly - 有很多问题。没有足够的数据来解决这个问题。

【讨论】:

以上是关于C# WPF 应用程序在发布模式下失控,但不是调试模式的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++Builder 发布模式下找到异常,但不是调试

在 wpf 应用程序中以调试模式检查当前用户凭据

C# WPF MVVM模式Prism框架下事件发布与订阅

错误只出现在发布模式而不是调试模式

代码在调试模式下运行但不是正常[重复]

如何在设计模式下调试 WPF 用户控件?