2011-06-13 47 views
0

所有的起始,WPF应用程序部署 - 问题与应用在另一台PC

我在SQLite数据库和用户/应用程序配置设置建立了一个WPF应用程序。应用程序在开发环境中建立并运行良好。我创建了一个安装和部署项目,添加了上述应用程序的“项目输出”,然后继续创建一个设置。该先决条件和.NET Framework版本的应用程序,并在设定的项目是一样的:

.NET Framework 3.5的客户端配置文件 MS Visual Basic中壹佰10.0.0 的Windows Installer 3.1

但是,当我将其移动到安装了相同.NET Framework的另一台PC上(但没有开发环境),应用程序无法启动。它给出了“遇到问题并需要关闭”的错误。我发现这将意味着应用程序中未捕获的异常。所以,我试图将部分应用程序注释掉,但没有处理它们,只剩下一个窗口显示(主窗口什么都不做),但应用程序失败。我开始怀疑问题可能是应用程序启动时未处理依赖关系。以下是我与他们:

  1. SQLite的需要自动添加到“检测到依赖”它被复制到应用程序目录
  2. SQLite数据库手动添加到项目中,他们被复制一个DLL到应用程序目录
  3. Application.exe.config文件不会被复制。我不知道把它们放在哪里

在这一点上,我想知道我该如何找出问题的根本原因。我尝试用单个窗口(并且没有功能)运行另一个简单的应用程序,它可以在目标机器上运行。 TIA

回答

1

如果您认为问题在于依赖关系,那么值得看看"Assembly Binding Log Viewer"(即fuslogvw.exe)。这个工具应该能够准确地告诉你哪个程序集被请求以及请求如何被满足或不满意。问题在于,这只适用于托管程序集。

如果你想知道什么是未处理的异常,那么你可以在应用程序入口处包装try ... catch。 WPF中的捕获是由编译器/ Visual Studio生成的,所以通常不能更改它。如果你想改变它,说把一个尝试..赶上围绕它,那么你需要(从http://www.infosysblogs.com/microsoft/2008/09/how_to_write_custom_main_metho.html采取为例):

  1. 找到的App.xaml和App.xaml.cs文件
  2. 打开属性页的App.xaml和更改构建行动 '页'
  3. 在App.xaml.cs添加哪些应该像一个main()方法:

    [STAThread] 
    public static void Main() 
    { 
        var app = new App(); 
        app.InitializeComponent(); 
        app.Run(); 
    } 
    

如果你围绕整个方法体包装try ... catch,那么你可以将任何错误信息写入文本文件。希望这会帮助你找出问题所在。

=====编辑=====

如果未处理的异常没有被抓到的尝试.. catch结构,那么它可以是一种粘合剂的问题。由于JIT编译器根据需要编译方法,因此它可能有助于将几乎所有代码移出入口方法。例如:

<!-- language: lang-cs --> 

    [STAThread] 
    public static void Main() 
    { 
     try 
     { 
      MyMethod(); 
     } 
     catch(Exception e) 
     { 
      // ... Write to file here 
     } 
    } 

    private static void MyMethod() 
    { 
     // .. Do actual work here 
    } 

这样做,你要确保你是在try ... catch结构,运行时尝试找到正确的组件等,但是请注意,有一些例外,可以不前被捕获(OutOfMemoryException,StackOverflowException和其他一些)。

+0

感谢您的回复。我一定会尝试后面的异常处理修复并查看结果。我会让你知道后来的结果 – rizter 2011-06-13 04:25:22

+0

Petrik,我尝试用手动编写的main()方法来运行应用程序,它围绕try {..}进行包装,但它没有帮助。那么,如果它不是一个未处理的异常,它可能是其中一个依赖关系吗?我仍然不确定如何在安装程序中打包数据库文件和配置文件(application_name.exe.config)文件。你能指点我到哪里我可以找到更多关于添加数据库和配置文件来设置项目的材料吗? – rizter 2011-06-14 03:04:03

+0

应用程序是否获取try .. catch循环内的代码?这可能是在您的代码被加载之前发生的问题。在这种情况下,它可能是一个依赖性问题。融合日志查看器应该能够帮助你。 – Petrik 2011-06-14 05:17:26

0

您是否考虑过为您的应用程序使用ClickOnce部署选项?

this SO question可以看出,应该可以将SQLite DB与ClickOnce应用程序捆绑在一起。你会得到其他好处(如果你感兴趣),例如自动更新。

+0

我尝试过ClickOnce部署,结果相同。我仍然不确定如何在安装程序中打包数据库文件和配置文件(application_name.exe.config)文件。你能指点我到哪里我可以找到更多关于添加数据库和配置文件来设置项目的材料吗? – rizter 2011-06-14 03:04:46

0

如果更改App.xaml.cs的命名空间,但不是App.xaml,也会出现此问题。当你添加上面的代码时,你会知道,因为InitializeComponent()调用不会被编译。