我目前正在开发一个C#WPF项目,该项目使用MySQL.Data和System.Data.Sqlite dll以及其他几个。
该项目是一个.Net 4项目,在我的开发机器上没有问题。我创建了一个MSI安装程序包,当我添加可执行文件Visual Studio时,计算出依赖关系,并在EXE中添加所需的DLL。
当我在开发机器上运行安装程序时,一切正常。但是,当我将安装程序复制到安装了.Net Framework 3.5和.Net Framework 4的空白虚拟机时,安装程序说所有内容都已成功安装,当我查看程序文件文件夹时,所有的DLL都在那里,但是当我尝试运行软件未加载的软件,并在事件查看器中显示.Net Runtime错误。
错误如下
应用程序:MySQLBackup.exe Framework版本:v4.0.30319 描述:由于未处理的异常,进程终止。 异常信息:System.IO.FileLoadException Stack:at MySQLBackup.App.Application_Startup(System.Object的, System.Windows.StartupEventArgs)at System.Windows.Application.OnStartup(System.Windows.StartupEventArgs) 在System.Windows.Application。< .ctor> b__1(System.Object)at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object,Int32)at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(System.Object的, System.Delegate,System.Object,Int32,System.Delegate)at System.Windows.Threading.DispatcherOperation.InvokeImpl()at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(System.Object的) 在System.Threading.ExecutionContext.runTryCode(System.Object)at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode,System.Object)at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback,System.Object)at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback,System.Object,Boolean)at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback,System.Object)at System.Windows.Threading.DispatcherOperation.Invoke()at System.Windows.Threading.Dispatcher.ProcessQueue()at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr,Int32,IntPtr, IntPtr,布尔ByRef)在MS.Win32.HwndWrapper.WndProc(IntPtr,Int32, IntPtr,IntPtr,Boolean ByRef)at MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object)at at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object,Int32)at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(System.Object的, System.Delegate,System.Object,Int32,System.Delegate)at System.Windows.Threading.Dispatcher.InvokeImpl(System.Windows.Threading.DispatcherPriority, System.TimeSpan,System.Delegate,System.Object,Int32)at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr,Int32,IntPtr,IntPtr) 在 MS.Win32.UnsafeNativeMethods.DispatchMessage(System.Windows.Interop.MSG ByRef)at System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame) 在 System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame) 在System.Windows.Threading.Dispatcher.Run()处 System.Windows.Application.RunDispatcher(System.Object)at System.Windows.Application.RunInternal(System.Windows.Window)at System.Windows.Application.Run(System.Windows.Window)at MySQLBackup.App.Main()
中的System.Windows.Application.Run()
错误消息并没有真正帮助我找出错误所以在Application Start up事件中我添加了try catch语句但是从未捕获到异常。我还添加了try InitialiseComponent()
方法,该方法在应该加载的第一个对话窗口上执行,但是从来没有抓到catch,所以我看不出导致错误的原因。
我如何弄清楚这个问题是什么并修复它?
答案 0 :(得分:4)
How can I figure out what this problem is and fix it.
使用visual studio remote debugger执行远程调试。
This tutorial提供了如何使用它的想法。
熟悉VS远程调试后,您将始终使用这个功能强大的工具来测试潜在的客户端环境。
至于您的特定问题,您在Application.Startup事件处理程序中有一些代码尝试加载某个文件并失败。在App.xaml中发布代码,以便我们可以分析,如果您自己无法找到问题来源。
答案 1 :(得分:3)
Fuslogw可以帮助调查库绑定的错误 见Fuslogvw.exe (Assembly Binding Log Viewer)
如何创建Sqllite连接? 可能是这篇帖子的帮助DbProviderFactory
答案 2 :(得分:0)
根据堆栈跟踪,问题出现在OnStartup调用的Application_Startup中。因此,您应检查是否已在代码中实现/覆盖或连接到那些可能导致这些异常的事件。由于多个方法可以订阅事件处理程序,因此无法保证代码中存在问题。
您可以创建一些日志记录检查点,以帮助缩小错误的位置,并在错误的上下文中记录日志值。
您还可以使用远程调试来尝试缩小错误的位置。
还有一些Unhandled Exception甚至处理程序,你可以google并学习如何实现,以便你可以在发生错误时执行日志记录,但通常在那时,除了优雅地关闭之外,获取更多信息已经很晚了,所以这可能是一个小沟渠。
您还可以使用此类SysInternals工具来确定程序尝试访问的文件,并过滤到故障: http://technet.microsoft.com/en-us/sysinternals/bb896645
您可以确定它尝试访问的最后一个文件是什么,甚至可能看到操作系统级别的错误。我发现这个工具在处理奇怪的文件访问问题时很有价值。虽然需要一段时间来弄明白。