代码之家  ›  专栏  ›  技术社区  ›  Keith

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

  •  6
  • Keith  · 技术社区  · 15 年前

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

    事件类型: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:系统.MissingMethodException

    请帮助:

    6 回复  |  直到 15 年前
        1
  •  2
  •   Gumbatron    14 年前

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

    问题是,当我的开发机器在3.5 ServicePack1上时,这个麻烦的机器正在运行框架版本3.5。将计算机升级到SP1解决了此问题。

    希望这能减轻一个人的痛苦。

        2
  •  3
  •   Fredrik Johansson    14 年前

    在Windowsxpsp3上测试我的应用程序时,我遇到了System.MissingMethodException。我最终安装了Visual Studio 2008 Express,尝试从头编译该应用程序。直到那时,编译器给了我相关的错误,结果发现autoreseteevent中的waitone方法只有一个带有2个参数的签名,因此我必须重写:

    reset.WaitOne(1000);

    reset.WaitOne(1000, true);

    我猜微软忘了在Windowsxp.net 3.5版本中添加第一个重载。因为它在Windows7中工作并且存在。去想一想。

        3
  •  3
  •   David Basarab    14 年前

    我使用的是vs2008,.net 3.5,在启动服务的线程时遇到了类似的问题。 升级到.NET 3.5 SP1解决了此问题。 谢谢你们的帮助。

        4
  •  2
  •   David Basarab    14 年前

    fwiw,我有一个p9 system.missingmethodexception错误,它使一个简单的应用程序在某些机器上崩溃,但在其他机器上却没有崩溃。我追踪到一条“waitone(2000)”行,它在线程中执行。在我的机器上从来不会引起问题,但它确实在其他机器上崩溃了,即使代码从未执行过!线还没到那条线。程序启动时发生了崩溃,这真是令人沮丧。我甚至在有问题的代码行周围有一个“try..catch”,但它没有帮助。我停止使用autoreseteevent并使用变量和 while( ! signaled ) { Thread.sleep(20); } ,这是一个蹩脚的拼凑,但它奏效了……

        5
  •  1
  •   Bryan Legend    15 年前

    missingmethodexception由jiter(实时编译器)引发。抖动一次将代码编译成一种汇编语言方法。Delegate方法(DisplayNextPicture)中有一个方法正在调用目标计算机上的库中不存在的方法,我猜想它运行的是旧版本的.NET。因为抖动找不到方法,它会爆炸。

    当我在安装了vs 2008和3.5sp1的计算机上构建时,我已经遇到过几次这种情况,然后尝试在只安装了3.0的计算机上运行。有时,微软会向库中添加一个方法,而不是升级它们的主要或次要版本。这通常在.NET框架服务包中完成。

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

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

        6
  •  1
  •   APerl    15 年前

    我也有同样的问题。我正在调用在执行版本.NET中不存在的Dispatcher.Invoke方法的重载。我在msdn上发现了一个有用的评论,关于这个方法,尽管我的问题略有不同。

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

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