2013-04-23 104 views
0

當在一臺機器上啓動我的應用程序時,它立即退出並說它已「停止工作」。在事件日誌中,我看到一個MissingMethodException是原因。沒有顯示異常對話框,並且在事件日誌詳細信息中,我看不到任何詳細的錯誤消息(包含例如「Method not found:xyz」)。診斷MissingMethodException

事件處理程序的信息說(試圖在這裏翻譯這回英文,可能不是逐字)

應用:Myapp.exe的框架版本v4.0.30319

說明:這個過程是由於終止未處理的異常

異常信息:system.missingMethodException而

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

如何才能找到哪個方法在引發此異常時丟失?它是一個託管應用程序,但它有一些本地依賴項。

編輯: 已編譯的程序集都編譯在同一個版本中,即應用程序的託管代碼中沒有版本不匹配。有可能二進制依賴不匹配,但如果是這樣,我怎麼能找出哪一個?

這是一個在VS 2012中構建的windows Forms應用程序,但是以4.0爲目標。這個錯誤在所有隻有框架4.0的機器上都沒有提出,所以這似乎不成問題。

+0

您正在使用什麼.NET運行時?它是WinForms嗎? WPF?在一臺機器上安裝了什麼.net運行時? – Jehof 2013-04-23 08:08:03

+0

添加了該信息。 – 2013-04-23 08:13:24

回答

3

MissingMethodException 告訴你的Message屬性缺少什麼方法。然而,給它一個機會告訴你,程序員經常忽略它。您必須爲AppDomain.UnhandledException事件編寫事件處理程序,並顯示或記錄e.UnhandledException對象。

請注意,您的程序在抖動崩潰很早時崩潰。在代碼執行之前,抖動運行。這使得您可能正在查看問題的錯誤代碼。它不是導致崩潰的Main()方法,很可能是您在Main方法中創建的表單。儘管這是猜測,但您忘記了將代碼發佈到Main()方法中。爲了安全起見,最好的做法是將事件註冊與代碼與cooties分開,最好通過抑制內聯來完成。修改程序。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的早期版本中不可用的方法。

+0

這是一個好主意。是的,我確實有一個未處理的異常處理程序,但沒有像這樣掛鉤,所以在這種情況下應用程序崩潰之前,它不會被初始化。 – 2013-04-23 10:01:07

+0

再次不確定你的事件處理程序是什麼樣的。請確保使用e.ExceptionObject.ToString(),如代碼片段所示,以便顯示消息以及StackTrace屬性。 – 2013-04-23 10:14:53

+0

謝謝我會接受這個答案,因爲它應該在未來對這些問題進行排序,謝謝。 – 2013-04-23 12:29:01

3

MissingMethodException通常指向組件版本中的不匹配。

一個例子是你有一個使用DLL的應用程序。兩者都是由你寫的。現在,您可以將新方法添加到DLL中的類中,並在應用程序中使用該方法。

現在,部署後,您只複製新的應用程序,但忘記複製新的DLL。當應用程序嘗試使用新方法時,結果將是MissingMethodException。

確保所有組件都具有正確的版本。

+0

是的。我在程序集中沒有不匹配(它們都是相同的內部版本號)。 – 2013-04-23 08:04:36

+1

我有這個問題。謝謝! – 2015-10-12 14:28:02

0

這裏是一個Blog post帶有信息來調試MissingMethodException,MissingFieldException,TypeLoadException。