首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MissingMethodException诊断

MissingMethodException诊断
EN

Stack Overflow用户
提问于 2013-04-23 07:53:32
回答 2查看 6.8K关注 0票数 1

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

事件处理程序信息显示(试图在这里将其翻译回英语,可能不是逐字)

应用程序: Myapp.exe框架-版本4.0.30319 描述:由于未处理的异常,进程被终止。 异常信息: System.MissingMethodException 堆栈: at MyApp.MainClass.Main(System.String[])

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

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

它是在VS 2012中构建的windows窗体应用程序,但目标是4.0。这个错误并不是在只有Framework4.0的所有机器上引发的,所以这似乎不是一个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-23 09:59:33

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

请注意,您的程序在抖动崩溃时很早就崩溃了。抖动在代码执行之前运行。这很可能是因为您看错了问题的代码。造成崩溃的不是Main()方法,很可能是您在主方法中创建的表单。尽管这是猜测,但您忘了在Main()方法中发布代码。为了安全起见,一个好的做法是将事件注册与代码分离,最好是通过抑制内联来完成。修改Program.cs源代码并使其看起来类似于以下内容:

代码语言:javascript
复制
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 \reference程序集。这将允许您使用在早期版本的.NET 4中不可用的方法。

票数 5
EN

Stack Overflow用户

发布于 2013-04-23 08:02:16

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

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

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

确保所有程序集都有正确的版本。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16163888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档