诊断MissingMethodException

时间:2013-04-23 07:53:33

标签: .net winforms .net-4.0 missingmethodexception

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

事件处理程序信息说(试图将此翻译成英文,可能不是逐字的)

  

应用程序:Myapp.exe Framework-version v4.0.30319

     

描述:由于未处理的异常

,进程终止      

异常信息:System.MissingMethodException

     

Stack:at MyApp.MainClass.Main(System.String [])

当引发此异常时,如何找到缺少哪个方法?它是一个托管应用程序,但它有许多本机依赖项。

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

这是一个在VS 2012中构建的Windows Forms应用程序,但目标是4.0。在只有框架4.0的所有机器上都不会出现错误,因此这似乎不是问题。

3 个答案:

答案 0 :(得分:4)

MissingMethodException通常指向程序集版本中的不匹配。

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

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

确保所有装配都具有正确的版本。

答案 1 :(得分:4)

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

请注意,您的程序在抖动崩溃时很早就崩溃了。在执行代码之前,抖动会运行。这使得您可能正在查找错误的代码以解决问题。导致崩溃的不是Main()方法,很可能是您在Main方法中创建的表单。虽然这是猜测,但您忘记在Main()方法中发布代码。为了安全起见,一个好的做法是将事件注册与代码与cooties分开,最好通过抑制内联来完成。修改Program.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中不可用的方法。

答案 2 :(得分:1)

这是一个Blog post,其中包含调试MissingMethodException,MissingFieldException,TypeLoadException的信息。