Winforms应用程序无法启动

时间:2019-04-17 09:21:14

标签: windows winforms

我有一个安装在多台计算机上的winforms应用程序。大多数情况下,它运行良好,但是对于一小部分用户,应用程序无法启动。我发现此问题的唯一解决方法是在用户计算机上重新安装该应用程序。

我在下面提供了屏幕截图,显示了成功启动后应用程序的工作情况,还显示了屏幕快照,显示了用户在应用程序失败时看到的内容

正常启动:

enter image description here

启动失败:

enter image description here

当应用程序失败时,启动表单完全不会呈现。在用户桌面上,根本看不到任何内容,该程序也不在任何可见区域之外。

如果有人可以提供答案或对以下问题的见解,将不胜感激。

什么可能导致此问题?

与Windows或程序相关?

如何解决?

我在下面的启动表单中添加了代码段

起始代码:

    private static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
            Application.Run(new Timelord());
        }

     public Timelord()
        {
            this.InitializeComponent();
            this.BringToFront();
            this.Focus();

            // Displays a date and gets the version of the program
            lblDate.Text = DateTime.Now.ToShortDateString();
            Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
            if (ApplicationDeployment.IsNetworkDeployed)
            {
                lblVersion.Text = string.Format("v{0}", ApplicationDeployment.CurrentDeployment.CurrentVersion.ToString(4));
            }

                // Loads the comboboxes for selection
                this.loadComboUser();
                this.loadComboCompany();
                this.loadComboTick();

            }

1 个答案:

答案 0 :(得分:1)

我认为这是在某些情况下您的Timelord构造函数中引发了一个错误。由于Timelord是应用程序的“启动”对象,因此无法正确创建其实例将导致严重的问题。我建议您这样做,以识别这些情况,并消除仅部分创建表格的问题。

根据您对数据库读取程序的评论,我假设以下一种或多种方法对数据库进行数据访问调用

this.loadComboUser();
this.loadComboCompany();
this.loadComboTick();

您通常希望避免方法调用,尤其是避免在构造函数中进行数据访问调用。有很多原因我不在这里列出,但是另一篇stackoverflow文章解释了其中的一些原因。

Is it OK to put a database initialization call in a C# constructor?

要解决这些问题,请为load事件实现一个事件处理程序,然后将所有Timelord构造函数代码移至Load事件处理程序中。在构造函数完成之后但在第一次显示表单之前触发Form.Load事件。

https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.form.load?view=netframework-4.7.2

这是我建议重组Timelord对象的方式。

public Timelord()
{
    this.InitializeComponent();
}

Private Sub Timelord_Load(sender As Object, e As EventArgs) Handles MyBase.Load
{
      Try
      {
            this.BringToFront();
            this.Focus();

            // Displays a date and gets the version of the program
            lblDate.Text = DateTime.Now.ToShortDateString();
            Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
            if (ApplicationDeployment.IsNetworkDeployed)
            {
                lblVersion.Text = string.Format("v{0}", ApplicationDeployment.CurrentDeployment.CurrentVersion.ToString(4));
            }

                // Loads the comboboxes for selection
                this.loadComboUser();
                this.loadComboCompany();
                this.loadComboTick();
      }
      Catch(Exception ex)
      {
           MessageBox.Show($"The following error occurred in the Timelord constructor {Environment.NewLine}{ex.Message}") 
      }
}

进行此更改将允许Timelord构造函数完全创建对象,然后Load事件将运行并将任何数据加载到UI中。这样,如果发生错误,您将至少已完全创建了Timelord表单并可以捕获该错误。

什么可能导致此问题?

您的启动对象(Timelord())在构造函数中引发错误,因此无法正确创建对象。

与Windows或程序相关?

程序相关

该如何解决?

  1. 分隔窗体逻辑,以便构造函数中的唯一代码是实例化逻辑。
  2. 实施Try / Catch块以捕获错误