1

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

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

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

说明:进程因未处理的异常而终止

异常信息:System.MissingMethodException

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

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

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

它是一个内置于 VS 2012 中但面向 4.0 的 Windows 窗体应用程序。并非所有只有框架 4.0 的机器上都会出现该错误,因此这似乎不是问题。

4

2 回答 2

5

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 中不可用的方法。

于 2013-04-23T09:59:33.513 回答
4

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

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

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

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

于 2013-04-23T08:02:16.487 回答