2009-04-30 120 views
6

我有一個WPF應用程序,它有一個窗體,當它啓動時,在新線程中調用一個自定義方法。.NET WPF當啓動新線程時MissingMethodException

Private Sub TestStep1_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded 
    Dim oThread As New Thread(AddressOf DisplayNextPicture) 
    oThread.Start() 
End Sub 

Private Sub DisplayNextPicture() 
    '' do stuff 
End Sub 

這可以在我的機器上正常工作,但在客戶端的機器上啓動新線程會導致MissingMethodException。我不知道爲什麼會發生這種情況(不幸的是客戶端位於遠程位置,因此我必須通過在跟蹤語句和試驗錯誤中滑動來進行調試)。這是肯定的DisplayNextPicture()方法,因爲我已經能夠通過跟蹤來確定沒有找到。

我能想到的唯一的事情就是這與框架級別的安全性有關。從WPF應用程序啓動新線程是否有限制?

我無法通過Application.DispatcherUnhandledException捕獲此異常,因此我無法獲取任何異常詳細信息或堆棧跟蹤。該客戶端獲得一個.NET運行時異常對話框具有以下信息,這是我所知道的異常類型的唯一途徑:

事件類型:clr20r3 P1:testapp.exe P2:1.0.0.0 P3:49fa2234 P4: mscorlib程序P5:2.0.0.0 P6:471ebc5b P7:1295 P8:14
P9:system.missingMethodException而

請幫助:)

+0

任何發佈異常和堆棧的機會? – 2009-05-01 08:50:20

+0

我無法捕捉到這個例外。我通過Application.DispatcherUnhandledException事件捕獲所有異常,但是這個漏洞通過某種方式滑過,我假設它是因爲它的本質。我知道這是一個MissingMethodException的唯一原因是用戶獲得有限的信息在.NET運行時異常對話框,但它提到了這一點例外: 事件類型:clr20r3 P1:testapp.exe P2:1.0.0.0 P3:49fa2234 P4: mscorlib P5:2.0.0.0 P6:471ebc5b P7:1295 P8:14 P9:system.missingmethodexception – Keith 2009-05-01 13:36:04

回答

2

剛試圖運行Windows服務(我寫的)時遇到此問題。該服務在我的測試環境中運行良好,但不在其他機器上運行。

問題原來是麻煩的機器運行的是Framework 3.5版,而我的開發機器是3.5 Service Pack 1.將機器升級到SP1修復了問題。

希望這可以緩解一些人的痛苦。

1

的MissingMethodException由JITer拋出(在即時編譯器) 。抖動一次將代碼編譯爲彙編語言的一種方法。在委託方法(DisplayNextPicture)中有一些方法正在調用目標機器上的庫中不存在的方法,我猜它正在運行舊版本的.net。由於抖動無法找到它爆炸的方法。

在VS 2008和3.5 SP1安裝的計算機上構建時,我已經遇到過這幾次,然後嘗試在僅安裝了3.0的計算機上運行。有時候微軟會向庫中添加一個方法,而不是升級他們的主版本或次版本。通常這是在.net框架服務包之一中完成的。

通過代理方法中的代碼,查看MSDN上的任何可疑方法,並仔細檢查「版本信息」以查看方法支持哪些框架版本。

如果可能的話,您也可以讓客戶端升級到最新的框架。

3

我正在使用VS2008,.Net 3.5,並有一個類似的問題啓動服務的線程。 升級到.Net 3.5 SP1解決了這個問題。 感謝您的幫助球員。

2

FWIW,我有一個P9系統。missingmethodexception錯誤是在某些機器上崩潰了一個簡單的應用程序,而在其他機器上卻沒有。我將其追蹤到一個在線程內執行的「.WaitOne(2000)」行。永遠不會在我的機器上造成問題,但它肯定會在其他機器上崩潰,即使該代碼從未執行!該線程甚至沒有得到該線。當程序啓動時發生崩潰,這真的令人沮喪。我甚至在代碼行問題上有一個「try..catch」,但它沒有幫助。我停止使用AutoResetEvent並使用變量和「while(! signaled) { Thread.sleep(20); },這是一個kludge,但它的工作....

+0

謝謝。這非常有幫助,有助於查明我遇到的確切問題。這篇文章解釋了這個問題以及如何最好地解決這個問題。 http://blog.darrenstokes.com/2009/03/30/watch-out-for-those-waitone-overloads-when-you-need-backwards-compatibility/ – 2010-03-03 15:14:51

3

當在Windows XP SP3上測試我的應用程序,目標.NET 3.5時,我得到了一個System.MissingMethodException 。我最終安裝了Visual Studio 2008 Express,嘗試從頭開始編譯應用程序,然後編譯器給了我相關的錯誤,結果發現AutoResetEvent中的WaitOne方法只有2個參數的簽名,因此我必須重寫:

reset.WaitOne(1000);

reset.WaitOne(1000, true);

我想,微軟忘了將第一個重載添加到Windows XP .NET 3.5版本。因爲它在Windows 7中工作並存在。