C#Winform应用程序无法在其他计算机上运行(神秘的Hang on Startup)

时间:2015-11-18 13:43:59

标签: c# .net winforms visual-studio deployment

我在Visual Studio中创建了一个winforms应用程序。这个应用程序是一个简单的Hello World应用程序,它将按钮的文本更改为" Hello World"按下时。

以下是代码:

using System;
using System.Windows.Forms;

namespace HelloWorld
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            try
            {
                InitializeComponent();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                button1.Text = "Hello World";
                button1.Enabled = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
}

当我尝试在我的开发计算机上打开此程序时,一切正常。我尝试在安装了.NET 3.5的10台不同的Windows PC上运行(我的目标平台),并且每个人都做同样的事情。

一旦我双击,或者右键单击并以管理员身份运行,似乎应用程序什么都不做,但我可以告诉它做某事,因为鼠标光标变为等待光标......它确实这无限期。它还会生成3个无法终止的应用程序名称的进程。没有错误或"此应用程序已停止工作"永远被抛出。

此外,我无法使用任务管理器,进程资源管理器,debugdiag或procdump创建故障转储。当我尝试使用进程资源管理器获取转储时...它会说"只是ReadProcessMemory的一部分"。当我尝试使用debugdiag创建时...转储是0字节并且在分析时失败。当我尝试使用procdump进行转储时...它将永远坐在那里。

我甚至试图以这种方式试图强迫某种错误......

using System;
using System.Windows.Forms;

namespace HelloWorld
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            try
            {
                System.Windows.Forms.Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
                System.Windows.Forms.Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(OnGuiUnhandedException);
                AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;

                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
            catch (Exception e)
            {
                HandleUnhandledException(e);
            }
            finally
            {
                // Do stuff
            }
        }

        private static void HandleUnhandledException(Object o)
        {
            // TODO: Log it!
            Exception e = o as Exception;

            if (e != null)
            {

            }
        }

        private static void OnUnhandledException(Object sender, UnhandledExceptionEventArgs e)
        {
            HandleUnhandledException(e.ExceptionObject);
        }

        private static void OnGuiUnhandedException(object sender, System.Threading.ThreadExceptionEventArgs e)
        {
            HandleUnhandledException(e.Exception);
        }
    }
}

后来我尝试在Main()函数开头的program.cs中放入一个MessageBox和一个return。它仍然在所有10台PC上做同样的事情。所以我认为当程序运行时,它实际上从未达到过这个目的:

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());

毕竟,我想知道它是否必须对我的Visual Studio设置或配置做任何事情。

我采取的步骤:

  1. 我在Visual Studio 2015中创建了新的winforms应用程序
  2. 我将.Net平台改为3.5
  3. 我将简单的应用程序编码为上面显示的
  4. 在配置管理器下我改为x86
  5. 我内置了调试和发布模式
  6. 在此之后,我尝试了3种部署方法:

    • 将整个发布文件夹复制到另一台计算机
    • 尝试过ClickOnce技术
    • 尝试过InstallShield Limited

    所有这些都不起作用。它们都做同样的事情......产生3个具有相同名称但无法终止的进程,除非我重新启动计算机。无法创建转储以查看问题所在。我跑步时无限期挂起,不显示任何错误或窗口。 ClickOnce和InstallShield永远不会通过任何类型的向导。他们只是无限期地挂起......

    我也试着在我的朋友们面前定位2.0,3.0,3.5,4.0,4.5,4.5.2 .NET版本。 PC和我的情况相同。这些PC是Windows 7和8.1。为什么我的简单HelloWorld应用程序会这样做?它是否在我的Visual Studio配置中?

1 个答案:

答案 0 :(得分:1)

我似乎最终解决了这个问题。问题在于我创建新项目时。它总是针对4.5.2。然后我会转到项目设置并从那里更改框架版本。

当我在创建项目之前选择除4.5.2之外的任何其他框架时,它可以工作。

我不知道为什么,但它为我修好了。