WPF应用程序部署 - 从另一台PC启动的应用程序问题

时间:2011-06-13 02:21:23

标签: c# wpf deployment

所有

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

.NET Framework 3.5客户端配置文件 MS Visual Basic Powerpacks 10.0.0 Windows Installer 3.1

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

  1. SQLite需要一个自动添加到“Detected Dependencies”的DLL,它会被复制到Application Directory
  2. 将SQLite数据库手动添加到项目中,并将它们复制到应用程序目录
  3. 不复制Application.exe.config文件。我不知道把它们放在哪里
  4. 此时,我想知道如何找出问题的根本原因。我尝试用一​​个窗口运行另一个简单的应用程序(并没有功能),它可以在目标机器上运行。 TIA

3 个答案:

答案 0 :(得分: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的属性页面,将构建操作更改为“Page”
  3. 在App.xaml.cs中添加一个Main()方法,该方法应如下所示:

    [STAThread]
    public static void Main()
    {
        var app = new App();
        app.InitializeComponent();
        app.Run();
    }
    
  4. 如果你将try ..包裹在整个方法体周围,那么你可以将错误信息写入文本文件。希望这能帮助你找出问题所在。

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

    如果try .. 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和其他一些)。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

如果您更改了App.xaml.cs的名称空间,而不是App.xaml的名称空间,则也会出现此问题。您将知道,在您添加上述代码的那一刻,因为InitializeComponent()调用将无法编译。