诊断MissingMethodException

And*_*ren 1 .net .net-4.0 missingmethodexception winforms

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

事件处理程序信息说(试图将其翻译回英语,可能不是逐字记录)

应用程序:Myapp.exe Framework版本v4.0.30319

说明:由于未处理的异常,进程已终止

异常信息:System.MissingMethodException

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

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

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

它是VS 2012中内置但针对4.0的Windows Forms应用程序。在只有Framework 4.0的所有计算机上都不会引发该错误,因此这似乎不是问题。

Han*_*ant 5

MissingMethodException 通过其Message属性告诉您缺少什么方法。但是,让程序员有机会告诉您的机会常常被忽略。您必须为AppDomain.UnhandledException事件编写事件处理程序,并显示或记录e.UnhandledException对象。

请注意,您的程序在抖动崩溃时很早就崩溃了。抖动执行代码之前运行。这可能导致您正在寻找错误的代码来解决该问题。并不是导致崩溃的Main()方法,最有可能是您在Main方法中创建的表单。尽管这只是一个猜测,但您忘记将代码发布到Main()方法中。为了安全起见,一个好的实践是将事件注册与带有代码的代码分开,最好通过抑制内联来实现。修改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));
        }
Run Code Online (Sandbox Code Playgroud)

您很可能会用自己的方法之一取回名称。但是,请勿低估看到框架方法的可能性。.NET 4有四个不同的版本,您无法猜测用户计算机上的哪个版本。如果是这种情况,那么在创建项目时就犯了一个错误,您是从c:\ windows \ microsoft.net子目录中添加了程序集引用,而不是c:\ program files \ reference程序集。这样您就可以使用.NET 4早期版本中没有的方法。