启动新线程时出现.NET WPF MissingMethodException

时间:2009-04-30 22:06:43

标签: .net wpf multithreading exception

我有一个WPF应用程序,其表单在启动时会在新线程中调用自定义方法。

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运行时异常对话框,这是我知道异常类型的唯一方法:

  

EventType: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

请帮助:)

6 个答案:

答案 0 :(得分:3)

我正在使用VS2008,.Net 3.5并且在启动服务的线程时遇到了类似的问题。 升级到.Net 3.5 SP1解决了这个问题。 谢谢你的帮助。

答案 1 :(得分:3)

在Windows XP SP3上测试我的应用程序时,我遇到了一个System.MissingMethodException,目标是.NET 3.5。我最终安装了Visual Studio 2008 Express,尝试从头开始编译应用程序。只有这样,编译器给了我相关的错误,它发现AutoResetEvent中的WaitOne方法只有一个带有2个参数的签名,因此我不得不重写:

reset.WaitOne(1000);

reset.WaitOne(1000, true);

我想微软忘记在Windows XP .NET 3.5版本中添加第一个重载。因为它在Windows 7中有效并且存在。转到图。

答案 2 :(得分:2)

FWIW,我有一个P9 system.missingmethodexception错误,它在一些机器上崩溃了一个简单的应用程序而在其他机器上没有。我将其追踪到一个在线程内执行的“.WaitOne(2000)”行。永远不会在我的机器上造成问题,但它肯定会在其他机器上崩溃,即使代码从未执行过!线程甚至没有达到那条线。程序启动时发生了崩溃,这实在令人沮丧。我甚至围绕问题代码行进行了“try..catch”,但它没有帮助。我停止使用AutoResetEvent并使用了一个变量和一个“while( ! signaled ) { Thread.sleep(20); },这是一个kludge,但它工作....

答案 3 :(得分:2)

尝试运行Windows服务时遇到此问题(我已经写过)。该服务可以在我的测试环境中正常运行,但不能在另一台机器上运行。

问题是,当我的开发机器在3.5 Service Pack 1上时,麻烦的机器运行了Framework 3.5版。将机器升级到SP1解决了这个问题。

希望这能缓解某人的痛苦。

答案 4 :(得分:1)

JITer(即时编译器)抛出了MissingMethodException。抖动一次将代码编译成汇编语言。委托方法(DisplayNextPicture)中有一些方法正在调用目标机器上的库中不存在的方法,我猜测它正在运行旧版本的.net。由于抖动无法找到它爆炸的方法。

我在安装了VS 2008和3.5 SP1的计算机上构建时尝试运行几次,然后尝试在安装了3.0的计算机上运行。有时Microsoft会向库中添加一个方法,而不是升级它们的主要版本或次要版本。通常这是在一个.net框架服务包中完成的。

查看委托方法中的代码并查看任何可疑方法的MSDN,并仔细检查“版本信息”以查看方法支持哪些框架版本。

如果可能的话,你也可以让你的客户升级到最新的框架。

答案 5 :(得分:1)

我遇到了同样的问题。我正在调用Dispatcher.Invoke方法的重载,该方法在.Net的执行版本中不存在。我在MSDN上发现了一个有用的评论,虽然我的问题略有不同,但这个方法对我有帮助。

http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.invoke.aspx

如果您正在使用Invoke方法,请尝试使用具有DispatcherPriority的重载作为它的第一个参数。