排除已部署c#程序的故障

本文关键字:故障 程序 部署 排除 | 更新日期: 2023-09-27 18:01:58

在过去的几个星期里我一直在写一个c#程序,文本构建刚刚得到了它的最终签名。我通过visual studio发布了它,并将安装包发送给了我的客户端,但它在他们的计算机上根本不起作用。为了测试,我在他们的机器上安装了与我自己的完全相同的二进制文件。它是一个以一系列弹出窗口开始的程序,在最后一个弹出窗口之后,程序只是关闭而不是打开主窗口。我知道没有我的资料来源和我的客户的电脑故障排除是不可能的,但坦率地说,我甚至不知道从哪里开始。你能给我一些建议吗?我们都在用Windows 7,虽然我用的是64位版本,但我认为这不会有什么区别,尤其是在程序开始运行之后。

有什么建议从哪里开始找吗?

编辑我的解决方案依赖于一个自定义控件库,它直到(我猜)程序失败的this.Show()命令才出现。是否有一种方法来检查,如果不知何故不包括,但是,因为它是建立在我的电脑上,参考是在那里工作?我问,因为发布按钮只是命名我的项目,而不是作为一个整体的解决方案,虽然当我构建它在我的计算机上工作得很好,项目有库设置为依赖项中的依赖项。

排除已部署c#程序的故障

我建议你看一下Windows事件查看器。最有可能的是,它包含了一些关于坠机的有用信息。此外,可以远程调试应用程序,如如何:设置远程调试中所述。这就是我要做的。此外,尝试通过订阅应用程序来捕获应用程序中引发的所有异常。UnhandledException和AppDomain的UnhandledException事件。这将允许您获得调用堆栈。

从关于Excel Interop正在使用的评论中,我从MSDN得到了这个。这可能是显而易见的,但无论如何。

  1. 你必须在你的系统上安装Excel才能正常运行。

  2. 要使用COM互操作,您必须具有管理员或超级用户安全权限。有关安全性的更多信息,请参见。net框架安全性。

在他们的例子中,他们使用了以下代码。在您的启动代码中添加类似的检查可能会更好。

Microsoft.Office.Interop.Excel.Application xlApp;
xlApp = new Microsoft.Office.Interop.Excel.Application();
if (xlApp == null)
{
   Console.WriteLine("EXCEL could not be started. Check that your office installation and project references are correct.");
}

(注意:我自己从未使用过这个,所以我对它知之甚少,它纯粹是来自评论和MSDN上的一些搜索)。

如果您可以对应用程序进行更改,您可以尝试使用Trace输出或长期使用专用日志记录器(如log4net)记录抛出的任何异常。如果你在运行时加载了程序集,64位可能仍然是一个问题,你可能会得到著名的"BadImageFormat"异常。

如果可以的话,我也会设置一个win7 32位虚拟机来模拟"干净"机器上的客户端环境,这可能有助于重现问题。

编辑以澄清跟踪配置:

你可以在app.config中添加一个跟踪监听器:

<system.diagnostics>
    <trace autoflush="true" indentsize="4">
        <listeners>
            <add name="LogFileWriter" type="System.Diagnostics.TextWriterTraceListener" initializeData="C:'logs'FooApp.log"/>
        </listeners>
    </trace>
</system.diagnostics>

这将导致程序中的所有Trace.Write()语句写入您的日志(如果您有权写入配置的文件夹)。

您的目标CPU是什么?也许您已将其设置为x64,而您的客户端正在运行32位版本的Windows 7

  1. "简单""详细"日志添加日志可能性和"架构"(如果还没有),其中:

    Simple:只是你可能需要阅读的普通信息字符串

    Verbose:只是你能记录的一切,或者有一个意义的日志(取决于你的应用程序)

  2. 确保您记录处理的异常,并且能够通过您的AppDomain的标准订阅处理甚至未处理。
  3. 在每个窗口添加日志Show()和OnClosing()方法(至少在那些挂起的)
  4. 验证您的构建机器和客户端上的操作系统是否相同。
  5. 如果你的软件在某个地方写了一些东西,确保你有足够的权限去做(简单的测试只是要求客户端运行你的程序作为管理员
  6. 如果仍然不工作,启用详细模式,在客户端上运行应用程序并检查日志。

迟早你会发现一些东西,可能不能直接解释你的问题,但肯定会帮助你找到一个正确的方法来解决它。

问候。

有一次我遇到了和你差不多的情况,我在客户端机器上安装了来自System Internals的DebugView,并部署了一个调试版本的应用程序(这里是如何从c#跟踪和调试的)。

DebugView将显示你的程序发出的所有调试消息,这可能使你更容易找出问题所在。

在安装DebugView和你的应用程序之后,客户端将运行DebugView,确保捕获是活跃的,然后运行你的应用程序。所有你的调试消息(发送到System.Diagnostics.Debug)将显示在DebugView中,然后可以由你的客户端保存到一个文件并发送给你进行分析。