2013-04-23 100 views
0

当在一台机器上启动我的应用程序时,它立即退出并说它已“停止工作”。在事件日志中,我看到一个MissingMethodException是原因。没有显示异常对话框,并且在事件日志详细信息中,我看不到任何详细的错误消息(包含例如“Method not found:xyz”)。诊断MissingMethodException

事件处理程序的信息说(试图在这里翻译这回英文,可能不是逐字)

应用:Myapp.exe的框架版本v4.0.30319

说明:这个过程是由于终止未处理的异常

异常信息:system.missingMethodException而

堆栈:在MyApp.MainClass.Main(System.String [])

如何才能找到哪个方法在引发此异常时丢失?它是一个托管应用程序,但它有一些本地依赖项。

编辑: 已编译的程序集都编译在同一个版本中,即应用程序的托管代码中没有版本不匹配。有可能二进制依赖不匹配,但如果是这样,我怎么能找出哪一个?

这是一个在VS 2012中构建的windows Forms应用程序,但是以4.0为目标。这个错误在所有只有框架4.0的机器上都没有提出,所以这似乎不成问题。

+0

您正在使用什么.NET运行时?它是WinForms吗? WPF?在一台机器上安装了什么.net运行时? – Jehof 2013-04-23 08:08:03

+0

添加了该信息。 – 2013-04-23 08:13:24

回答

3

MissingMethodException 告诉你的Message属性缺少什么方法。然而,给它一个机会告诉你,程序员经常忽略它。您必须为AppDomain.UnhandledException事件编写事件处理程序,并显示或记录e.UnhandledException对象。

请注意,您的程序在抖动崩溃很早时崩溃。在代码执行之前,抖动运行。这使得您可能正在查看问题的错误代码。它不是导致崩溃的Main()方法,很可能是您在Main方法中创建的表单。尽管这是猜测,但您忘记了将代码发布到Main()方法中。为了安全起见,最好的做法是将事件注册与代码与cooties分开,最好通过抑制内联来完成。修改程序。cs源代码,并使其看起来类似于:

using System.Runtime.CompilerServices; 
... 
     [STAThread] 
     static void Main() { 
      AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 
      RealMain(); 
     } 

     [MethodImpl(MethodImplOptions.NoInlining)] 
     static void RealMain() { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      // Your code here 
      //... 
     } 

     static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { 
      var ex = (Exception)e.ExceptionObject; 
      MessageBox.Show(ex.ToString(), "Unexpected error"); 
      Environment.Exit(System.Runtime.InteropServices.Marshal.GetHRForException(ex)); 
     } 

您很可能会得到您自己方法之一的名称。但是不要打折你会看到框架方法的可能性。 .NET 4有四种不同的版本,您无法猜测用户计算机上的哪一个版本。如果是这种情况,那么当您创建项目时出现了错误,您从c:\ windows \ microsoft.net子目录中添加了程序集引用,而不是c:\ program files \ reference程序集。这将允许您使用.NET 4的早期版本中不可用的方法。

+0

这是一个好主意。是的,我确实有一个未处理的异常处理程序,但没有像这样挂钩,所以在这种情况下应用程序崩溃之前,它不会被初始化。 – 2013-04-23 10:01:07

+0

再次不确定你的事件处理程序是什么样的。请确保使用e.ExceptionObject.ToString(),如代码片段所示,以便显示消息以及StackTrace属性。 – 2013-04-23 10:14:53

+0

谢谢我会接受这个答案,因为它应该在未来对这些问题进行排序,谢谢。 – 2013-04-23 12:29:01

3

MissingMethodException通常指向组件版本中的不匹配。

一个例子是你有一个使用DLL的应用程序。两者都是由你写的。现在,您可以将新方法添加到DLL中的类中,并在应用程序中使用该方法。

现在,部署后,您只复制新的应用程序,但忘记复制新的DLL。当应用程序尝试使用新方法时,结果将是MissingMethodException。

确保所有组件都具有正确的版本。

+0

是的。我在程序集中没有不匹配(它们都是相同的内部版本号)。 – 2013-04-23 08:04:36

+1

我有这个问题。谢谢! – 2015-10-12 14:28:02

0

这里是一个Blog post带有信息来调试MissingMethodException,MissingFieldException,TypeLoadException。