2009-04-30 39 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中工作并存在。

相关问题