2009-04-30 16 views
6

Tengo una aplicación WPF con un formulario que, cuando se inicia, invoca un método personalizado en un nuevo hilo..NET WPF MissingMethodException al iniciar un nuevo hilo

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 

Esto funciona bien en mi máquina, pero en la máquina de un cliente de la puesta en marcha de los nuevos resultados de rosca en un MissingMethodException. No estoy seguro de por qué sucedería esto (y desafortunadamente el cliente está en una ubicación remota, así que tengo que depurar esto deslizando en las declaraciones de seguimiento y prueba y error). Definitivamente es el método DisplayNextPicture() que no se encuentra, como he podido determinar a través del seguimiento.

Lo único que puedo pensar es que esto tiene que ver con la seguridad en el nivel del marco. ¿Existen restricciones para el lanzamiento de nuevos subprocesos desde una aplicación WPF?

No puedo ver esta excepción a través de Application.DispatcherUnhandledException, por lo que no puedo obtener ningún detalle de excepción o stack trace. El cliente obtiene un diálogo de excepción de .NET en tiempo de ejecución con la siguiente información y esta es la única forma que conozco el tipo de excepción:

EventType: clr20r3 P1: P2 TestApp.exe: 1.0.0.0 P3: 49fa2234 P4: mscorlib P5: 2.0.0.0 P6: 471ebc5b P7: 1295 P8: 14
P9: System.MissingMethodException

favor ayuda :)

+0

¿hay alguna posibilidad de publicar la excepción y la pila? –

+0

No puedo ver esta excepción. Capturo todas las excepciones a través del evento Application.DispatcherUnhandledException, pero este se desliza de alguna manera, lo asumo por su naturaleza. La única razón por la que sé que es una MissingMethodException es que el usuario obtiene un diálogo de excepción de tiempo de ejecución .NET con información limitada, pero menciona esta excepción: Tipo de evento: 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

Respuesta

2

Acabo de encontrar este problema al intentar ejecutar un servicio de Windows (que había escrito). El servicio funcionaría bien en mi entorno de prueba, pero no en una máquina diferente.

El problema resultó ser que la máquina problemática ejecutaba la versión 3.5 de Framework mientras mi máquina de desarrollo estaba en 3.5 Service Pack 1. La actualización de la máquina a SP1 solucionó el problema.

Espero que esto alivie un poco el dolor de alguien.

+0

¡Gracias, SP1 suena como la solución! – Keith

1

el MissingMethodException es lanzada por el JITer (el compilador justo a tiempo) . El jitter compila el código en lenguaje ensamblador un método a la vez. Hay algún método dentro del método de delegado (DisplayNextPicture) que llama a un método que no existe en las bibliotecas en el equipo de destino, que supongo que está ejecutando una versión anterior de .net. Como el jitter no puede encontrar el método, explota.

Me he encontrado con esto algunas veces ahora cuando se basa en una computadora con VS 2008 y 3.5 SP1 instalado y luego trato de ejecutarlo en una computadora con solo 3.0 instalado. En ocasiones, Microsoft agregará un método a las bibliotecas y no actualizará sus versiones mayor o menor. A menudo esto se hace en uno de los paquetes de servicio de .NET Framework.

Revise el código en su método de delegado y mire MSDN en cualquier método sospechoso y vuelva a verificar la "Información de versión" para ver qué versiones de marcos son compatibles con un método.

También podría hacer que su cliente actualice al último framework si eso es posible.

1

Estaba teniendo el mismo problema. Llamaba a una sobrecarga del método Dispatcher.Invoke que no existía en la versión de ejecución de .Net. Encontré un comentario útil en MSDN sobre el método que me ayudó, aunque mi problema era ligeramente diferente.

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

Si está utilizando el método de invocación intente utilizar la sobrecarga que tiene DispatcherPriority ya que es el primer argumento.

3

Estaba usando VS2008, .Net 3.5 y tuve un problema similar al iniciar el hilo de un servicio. La actualización a .NET 3.5 SP1 solucionó el problema. Gracias por su ayuda chicos.

2

FWIW, tenía un sistema P9.Falta un error de error de la quebradora que bloqueaba una aplicación simple en algunas máquinas pero no en otras. Lo rastreé hasta una línea ".WaitOne (2000)" que se estaba ejecutando dentro de un hilo. Nunca causa un problema en mi máquina, pero seguro se colgó en esas otras máquinas, ¡AUNQUE NUNCA SE EJECUTÓ EL CÓDIGO! El hilo ni siquiera había llegado a esa línea. El accidente estaba ocurriendo cuando el programa comenzó, lo que fue realmente frustrante. Incluso tuve un "try..catch" alrededor de la línea del problema del código, y no ayudó. Dejé de usar AutoResetEvent y usé una variable y un "while(! signaled) { Thread.sleep(20); }, que era un kludge, pero funcionó ....

+0

Gracias. Esto fue extremadamente útil y ayudó a identificar el problema exacto que estaba teniendo. Aquí está el artículo que explica el problema y cómo solucionarlo mejor. http://blog.darrenstokes.com/2009/03/30/watch-out-for-those-waitone-overloads-when-you-need-backwards-compatibility/ –

3

Obtuve una System.MissingMethodException al probar mi aplicación, con la orientación .NET 3.5, en Windows XP SP3 Terminé instalando Visual Studio 2008 Express para intentar compilar la aplicación desde el inicio. Solo entonces, el compilador me dio el error relevante, se descubrió que el método WaitOne en AutoResetEvent solo tenía una firma con 2 parámetros, así que tuve que reescribir :

reset.WaitOne(1000);

a

reset.WaitOne(1000, true);

Supongo que Microsoft olvidó agregar la primera sobrecarga a la versión de Windows XP .NET 3.5. Porque funciona, y existe, en Windows 7. Ve figura.

Cuestiones relacionadas