2009-04-30 2 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 во время выполнения со следующей информацией, и это единственный способ, которым я знаю тип исключения:

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

Пожалуйста, помогите :)

+0

любой шанс опубликовать исключение и стек? –

+0

Я не могу поймать это исключение. Я поймаю все исключения с помощью события Application.DispatcherUnhandledException, но этот проскальзывает через какое-то время, я предполагаю из-за его природы. Единственная причина, по которой я знаю, что это MissingMethodException, заключается в том, что пользователь получает диалог исключения среды выполнения .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 – Keith

ответ

2

Только что столкнулся с этой проблемой при попытке запустить службу Windows (которую я написал). Служба будет работать нормально в моей тестовой среде, но не на другой машине.

Проблема оказалась в том, что проблемная машина запускала версию Framework 3.5, в то время как моя машина для разработки была на 3.5 Service Pack 1. Обновление машины до SP1 устранило проблему.

Надеюсь, это немного облегчит чью-то боль.

+0

Спасибо, SP1 звучит как решение! – Keith

1

в MissingMethodException выбрасываются в JITer (праведник во время компилятора) , Джиттер компилирует код на язык ассемблера одним методом за раз. Существует некоторый метод внутри метода делегата (DisplayNextPicture), который вызывает метод, который не существует в библиотеках на целевой машине, и я предполагаю, что работает более старая версия .net. Поскольку джиттер не может найти способ, который он взрывает.

Я столкнулся с этим несколько раз при создании на компьютере с VS 2008 и 3.5 SP1, а затем попытаюсь запустить компьютер с установленным только 3.0. Иногда Microsoft добавляет метод в библиотеки и не обновляет их основные или младшие версии. Часто это делается в одном из пакетов обновления .net framework.

Пройдите код в методе делегата и посмотрите MSDN на любые подозрительные методы и дважды проверьте «Сведения о версии», чтобы узнать, какие версии рамок поддерживаются для метода.

Вы также можете просто обновить свой клиент до последней версии, если это возможно.

1

У меня была такая же проблема. Я вызывал перегрузку метода Dispatcher.Invoke, которого не было в исполняемой версии .Net. Я нашел полезный комментарий в MSDN о методе, который помог мне, хотя моя проблема была немного иной.

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

Если вы используете метод Invoke попробуйте использовать перегрузку, которая имеет DispatcherPriority, как это первый аргумент.

3

Я использовал VS2008, .Net 3.5 и имел аналогичную проблему, начиная поток для службы. Обновление до .Net 3.5 SP1 устраняет проблему. Спасибо за помощь.

2

FWIW, у меня была система P9.errormethodexception, которая разбивала простое приложение на некоторых машинах, но не на других. Я проследил его до строки «.WaitOne (2000)», которая выполнялась внутри потока. Никогда не вызывает проблемы с моей машиной, но она наверняка рухнула на эти другие машины, ДАЖЕ, ЧТО КОД НЕ БЫЛО ВЫПОЛНИТЬ! Нить даже не дошла до этой линии. Сбой произошел, когда программа запустилась, что было очень неприятно. У меня даже была «try..catch» вокруг проблемной строки кода, и это не помогло. Я прекратил использование AutoResetEvent и использовал переменную и «while(! signaled) { Thread.sleep(20); }, который был клопиком, но он сработал ...

+0

Спасибо. Это было очень полезно и помогло выявить точный вопрос, который у меня был. Вот статья, в которой объясняется проблема и как ее лучше всего исправить. http://blog.darrenstokes.com/2009/03/30/watch-out-for-those-waitone-overloads-when-you-need-backwards-compatibility/ –

3

У меня возникло исключение System.MissingMethodException при тестировании моего приложения с таргетингом на .NET 3.5 на Windows XP SP3 Я закончил установку Visual Studio 2008 Express, чтобы попытаться скомпилировать приложение с самого начала. Только тогда компилятор дал мне соответствующую ошибку, выяснилось, что метод WaitOne в AutoResetEvent имел только подпись с двумя параметрами, поэтому мне пришлось переписать :

reset.WaitOne(1000);

в

reset.WaitOne(1000, true);

Я полагаю, что Microsoft забыла добавить первую перегрузку в версию Windows XP .NET 3.5. Поскольку он работает и существует, в Windows 7. Перейдите к рисунку.

Смежные вопросы