在另一台计算机上运行C#程序时出现System.IO.FileLoadException

时间:2011-09-16 21:37:28

标签: c# wpf fileloadexception

我目前正在开发一个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,所以我看不出导致错误的原因。

我如何弄清楚这个问题是什么并修复它?

3 个答案:

答案 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

您可以确定它尝试访问的最后一个文件是什么,甚至可能看到操作系统级别的错误。我发现这个工具在处理奇怪的文件访问问题时很有价值。虽然需要一段时间来弄明白。