排除部署的c#程序故障

时间:2011-07-12 21:11:43

标签: c# deployment publishing

过去几周我一直在编写一个c#程序,文本版本刚刚签署完毕。我通过visual studio发布它,将安装程序包发送给我的客户端,它根本无法在他们的计算机上运行。为了测试,我已经在他们自己安装了完全相同的二进制文件。这是一个以一系列弹出窗口开始的程序,在最终弹出窗口之后,程序只是关闭而不是打开主窗口。我明白,如果无法访问我的源代码和我的客户的计算机故障排除是不可能的,但坦率地说,我甚至不知道从哪里开始。我能得到一些关于要看什么的建议吗?我们都运行Windows 7,虽然我有64位版本,但我认为这不应该有所作为,特别是因为程序开始运行。

有关从哪里开始寻找的建议吗?

修改的 我的解决方案取决于一个自定义控件库,直到this.Show()命令(我猜测)程序失败才出现。有没有办法检查是否以某种方式不包括但是,因为它是在我的计算机上构建的,所以参考在那里工作?我问,因为发布按钮只是命名我的项目,而不是整个解决方案,但是当我构建它在我的计算机上工作正常并且项目将库设置为其依赖项中的依赖项。

6 个答案:

答案 0 :(得分:2)

我建议您查看Windows事件查看器。最有可能的是,它包含一些有关崩溃的有用信息。此外,可以按照How to: Set Up Remote Debugging中的说明远程调试您的应用程序。这就是我要做的。此外,尝试通过订阅Application.UnhandledException和AppDomain的UnhandledException事件来捕获应用程序中引发的所有异常。这将允许您获取callstack。

答案 1 :(得分:2)

如果您可以对应用程序进行更改,您可以尝试使用Trace输出或长期使用log4net等专用记录器记录任何异常。另外,使用DependencyWalker查看依赖项可能很有用 - 如果在运行时加载程序集,64位可能仍然是一个问题,您可能会得到着名的“BadImageFormat”异常。

如果您还可以设置Win 7 32位VM来模拟“干净”机器上的客户端环境,这可能有助于重现问题。

编辑以阐明跟踪配置:

您可以在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()语句写入日志(前提是您有权写入已配置的文件夹)。

答案 2 :(得分:2)

我正在使用Excel Interop的评论来自MSDN。这可能很明显,但无论如何。

  
      
  1. 您必须在系统上安装Excel才能使此代码正常运行。

  2.   
  3. 要使用COM互操作,您必须具有管理员或高级用户安全权限。有关安全性的更多信息,请参阅.NET Framework安全性。

  4.   

在他们的示例中,他们使用以下代码。可能很适合在启动代码中添加类似的检查。

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上的搜索引导)。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

  1. 添加日志可能性和(如果尚未进入)和“架构”至少为“简单”“详细”日志记录,其中:

    简单:只需要​​您可能需要阅读的常见信息

    详细:只有你能做到的每一个,或者有记录的意义(取决于你的申请)

  2. 确保您记录已处理的例外情况,并且能够通过标准版订阅AppDomain处理未处理的广告。
  3. 在每个窗口上添加日志Show()和OnClosing()方法(至少在那些挂起的窗口上)
  4. 验证操作系统是否与yuor构建计算机和客户端上的相同
  5. 如果您的软件在某处写了某些东西,请确保您有足够的优先权(简单的测试只是要求客户运行您的程序作为管理员
  6. 如果仍然无法正常启用详细模式并在客户端上运行应用程序并检查日志。
  7. 你迟早会发现一些可能无法直接解释你问题的东西,但肯定会帮助你找到解决问题的正确方法。

    问候。

答案 5 :(得分:0)

在与您的情况几乎相似的情况下帮助我的是在客户端计算机中从System Internals安装DebugView并部署应用程序的调试版本(here's how to trace and debug from C#)。

DebugView将显示程序发出的所有调试消息,这可以让您轻松找出出错的地方。

安装DebugView和您的应用程序之后,客户端将运行DebugView,确保捕获处于活动状态,然后运行您的应用程序。所有调试消息(发送到System.Diagnostics.Debug)都会显示在DebugView中,然后由客户端保存到文件中并发送给您进行分析。