当在一台机器上启动我的应用程序时,它会立即退出,说它已“停止工作”。在事件日志中,我看到一个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的所有机器上都不会出现错误,因此这似乎不是问题。
答案 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的信息。