【问题标题】:Static Class/Method Stopping my application静态类/方法停止我的应用程序
【发布时间】:2011-03-03 14:26:02
【问题描述】:

我在从另一个方法调用静态方法时遇到问题。

我的静态方法在一个单独的项目中,但我检查了引用和 using 语句,一切似乎都正确。以下是简化版。

静态方法

namespace Backend
{
    static public class StartUpChecks
    {
        public static void RunAtStart()
        {
            // Calls other static methods and sets application settings
        }
     }
}

Windows 窗体

using Backend;

namespace UI
{
    public partial class mainForm:Form
    {
        public mainForm()
        {
            InitializeComponent();
        }
        private void mainForm_Load(object sender, EventArgs e)
        {
            //MessageBox.Show("It Works");
            StartUpChecks.RunAtStart();
        }
    }
}

当我运行程序时,它就会停止。我在 OnLoad 事件处理程序上设置了一个断点,但它永远不会被击中。如果我在 MessageBox 中注释并注释掉方法调用,事件就会触发并显示消息框。

我在 VS 中没有显示错误。我尝试创建另一个方法 Test(),并将 StartUpChecks.RunAtStart() 移入其中。然后我将 Test() 调用放在 MessageBox 之后。事件触发,消息框显示,但不会移动到 Test() 方法。

同样在 VS 中调试时,我无法重新启动进程,也无法进入/跳过任何内容。

任何想法我做错了什么?

编辑---

完整的静态类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DataSourceManager;
using UserValidator;

namespace Backend
{
    static public class StartUpChecks
    {
        public static void RunAtStart()
        {
            CheckUserAuthorised();
            CheckUserAdmin();
            SetConnection("myApplication");
        }

        private static void SetConnection(string appName)
        {
            AppControl.Connection = ConnectionSetter.SetConnectionString(appName);
        }

        private static void CheckUserAuthorised()
        {
            UserValidation checkMe = new UserValidation(AppControl.Connection);
            AppControl.UserIsAuthorised = checkMe.UserIsAuthorised();
        }

        private static void CheckUserAdmin()
        {
            UserValidation checkMe = new UserValidation(AppControl.Connection);
            AppControl.UserIsAdmin = checkMe.UserIsAdmin();
        }
    }
}

【问题讨论】:

  • StartUpChecks 类中还有什么?是否有可能抛出异常的静态构造函数?
  • @Blorgbeard 不,没有静态构造函数。我需要一个吗?这是问题所在吗?
  • 在这种状态下调试时,如果在Visual Studio中按下Pause(Ctrl+Break),哪一行会高亮显示? (希望不是 Application.Run())
  • @Slotty,这不仅仅是我的想法。
  • 您的 VS 调试器是否配置为处理抛出异常而不是未处理的异常?

标签: c# winforms static-methods


【解决方案1】:

请尝试配置 VS 处理抛出的异常:

主菜单 -> 调试 -> 异常 => 在“抛出”单元格中设置 CLR 异常旁边的复选框

其他点启用外部代码调试

主菜单 -> 工具 -> 选项 -> 调试 -> 在我的代码中取消选中点

更改后尝试运行您的应用程序

【讨论】:

  • @ Viacheslav - 我得到一个 TypeLoadException - “无法从程序集 'MyApplication,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null' 加载类型 'Backend.StartUpChecks'” - 这是什么东西容易修复? MSDN 告诉我它是什么,但不告诉我如何处理它。
  • 对不起,我不知道
【解决方案2】:

操作系统和 64 位调试器之间的交互存在严重错误。它会导致在 Load 事件处理程序(或 OnLoad 方法覆盖)中引发的异常在没有诊断的情况下被吞没。

绕过它的最佳方法是使用项目 + 属性、构建选项卡、平台目标 = x86。这是 VS2010 的默认设置,也可以重新启用 Edit + Continue。好的。如果在 64 位模式下运行真的很重要,那么您可以使用 Debug + Exceptions 捕获异常,勾选公共语言运行时异常的抛出框。

否则此错误不会在您的最终程序中写入字节,只有在附加调试器时才会出错。

【讨论】:

  • 我刚刚检查并设置为 x86。很好的建议,虽然谢谢
【解决方案3】:

尝试在 AppDomain.CurrentDomain.UnhandledException 事件上捕获错误。您在主窗体构造函数中添加此代码。

    public MainForm()
    {
        InitializeComponent();
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
    }

    void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        //Diagnose the exception here..
    }

此外,您可以尝试使用实时 Windows 客户端调试和跟踪实用程序“Donsole”进行实时跟踪。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多