问题描述
|
所有,
我有一个基于SQLite数据库和用户/应用程序配置设置的WPF应用程序。该应用程序可以在开发环境中构建并正常运行。我创建了安装和部署项目,添加了上述应用程序的“项目输出”,然后继续创建安装程序。应用程序和安装项目中的先决条件和.NET Framework版本相同:
.NET Framework 3.5客户端配置文件
MS Visual Basic电源包10.0.0
Windows Installer 3.1
但是,当我将其移动到安装了相同.NET Framework的另一台PC上(但没有开发环境)时,该应用程序无法启动。它给出一个“遇到问题,需要关闭”的错误。我发现这将意味着应用程序中未捕获的异常。因此,我试图注释掉应用程序中没有处理的部分,只剩下一个窗口显示(主窗口什么都不做),但是应用程序失败了。我开始怀疑问题可能是应用程序启动时没有处理依赖关系。这是我对他们所做的:
SQLite需要一个自动添加到“检测到的依赖项”中的DLL,并将其复制到应用程序目录中
手动将SQLite数据库添加到项目中,并将它们复制到应用程序目录中
不复制Application.exe.config文件。我不确定放在哪里
在这一点上,我想知道如何找出问题的根本原因。我尝试用一个窗口(没有功能)运行另一个简单的应用程序,并且它可以在目标计算机上运行。 TIA
解决方法
如果您认为问题出在依赖项上,那么可能有必要查看\“ Assembly Binding Log Viewer \”(即fuslogvw.exe)。该工具应该能够准确告诉您所请求的程序集以及如何满足或不满足请求。问题是,这仅适用于托管程序集。
但是,如果您想找出未处理的异常是什么,则可以在应用程序入口点周围包裹try .. catch。 WPF中的问题是它是由编译器/ Visual Studio生成的,因此通常无法更改它。如果确实要更改它,请说说尝试一下..赶上它,然后您需要这样做(示例取自http://www.infosysblogs.com/microsoft/2008/09/how_to_write_custom_main_main_metho.html)
查找App.xaml和App.xaml.cs文件
打开App.xaml的属性页,并将生成操作更改为\'Page \'
在App.xaml.cs中,添加Main()方法,该方法应类似于:
[STAThread]
public static void Main()
{
var app = new App();
app.InitializeComponent();
app.Run();
}
如果将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和其他一些异常) )。
, 您是否考虑过为应用程序使用ClickOnce部署选项?
从这个SO问题中可以看出,应该可以将SQLite DB与ClickOnce应用程序捆绑在一起。您将获得其他好处(如果您有兴趣),例如自动更新。
, 如果您更改App.xaml.cs而不是App.xaml的名称空间,也会发生此问题。在添加上面的代码的那一刻,您将知道,因为InitializeComponent()调用不会编译。