当在一台机器上启动我的应用程序时,它会不可避免地退出,说它已经“停止工作”。在事件日志中,我看到一个MissingMethodException是原因。没有显示异常对话框,在事件日志详细信息中,我看不到任何详细的错误消息(例如,“方法找不到: xyz")。
事件处理程序信息显示(试图在这里将其翻译回英语,可能不是逐字)
应用程序: Myapp.exe框架-版本4.0.30319 描述:由于未处理的异常,进程被终止。 异常信息: System.MissingMethodException 堆栈: at MyApp.MainClass.Main(System.String[])
当引发此异常时,如何查找缺少哪种方法?它是一个托管应用程序,但它有许多本机依赖项。
编辑:编译后的程序集都是在同一个构建中编译的,即在应用程序的托管代码中没有版本不匹配。可能在二进制依赖项中存在不匹配,但是如果是的话,我如何才能找到哪一个呢?
它是在VS 2012中构建的windows窗体应用程序,但目标是4.0。这个错误并不是在只有Framework4.0的所有机器上引发的,所以这似乎不是一个问题。
发布于 2013-04-23 09:59:33
MissingMethodException告诉您它的Message属性缺少什么方法。然而,给它一个告诉您的机会却常常被程序员忽略。必须为AppDomain.UnhandledException事件编写事件处理程序,并显示或记录e.UnhandledException对象。
请注意,您的程序在抖动崩溃时很早就崩溃了。抖动在代码执行之前运行。这很可能是因为您看错了问题的代码。造成崩溃的不是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));
}您可能会得到您自己的方法之一的名称。但是,不要忽视您将看到框架方法的可能性。.NET 4有四个不同的版本,您无法猜出哪个版本在用户的机器上。如果是这样的话,那么您在创建项目时犯了一个错误,您从c:\windows\microsoft.net子目录中添加了程序集引用,而不是c:\program \reference程序集。这将允许您使用在早期版本的.NET 4中不可用的方法。
发布于 2013-04-23 08:02:16
MissingMethodException通常指出程序集的版本不匹配。
例如,您有一个使用DLL的应用程序。都是你写的。现在将一个新方法添加到DLL中的类中,并在应用程序中使用该方法。
现在,在部署时,您只复制新的应用程序,而忘记复制新的DLL。当应用程序尝试使用新方法时,结果将是一个MissingMethodException。
确保所有程序集都有正确的版本。
https://stackoverflow.com/questions/16163888
复制相似问题