2009-04-30 29 views
6

Tôi có một ứng dụng WPF với một biểu mẫu, khi bắt đầu, gọi một phương thức tùy chỉnh trong một luồng mới..NET WPF MissingMethodException khi khởi chạy chủ đề mới

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 

Điều này hoạt động tốt trên máy tính của tôi, nhưng trên máy của khách hàng, việc khởi chạy kết quả luồng mới trong MissingMethodException. Tôi không chắc chắn lý do tại sao điều này sẽ xảy ra (và tiếc là khách hàng là ở một vị trí từ xa vì vậy tôi đang phải gỡ lỗi này bằng cách trượt trong báo cáo dấu vết và thử và lỗi). Nó chắc chắn là phương thức DisplayNextPicture() không được tìm thấy, như tôi đã có thể xác định thông qua truy tìm.

Điều duy nhất tôi có thể nghĩ là điều này liên quan đến bảo mật ở cấp khung. Có hạn chế về việc tung ra các chủ đề mới từ một ứng dụng WPF?

Tôi không thể bắt ngoại lệ này thông qua Application.DispatcherUnhandledException vì vậy tôi không thể nhận được bất kỳ chi tiết ngoại lệ hoặc theo dõi ngăn xếp nào. Khách hàng nhận được một hộp thoại ngoại lệ .NET runtime với các thông tin sau đây và đây là cách duy nhất tôi biết loại ngoại lệ:

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

Xin vui lòng giúp :)

+0

bất kỳ cơ hội nào để đăng ngoại lệ và ngăn xếp? –

+0

Tôi không thể bắt ngoại lệ này. Tôi bắt tất cả các ngoại lệ thông qua sự kiện Application.DispatcherUnhandledException nhưng sự kiện này trượt qua một cách nào đó, tôi giả sử vì bản chất của nó. Lý do duy nhất tôi biết đó là một MissingMethodException là người dùng nhận được một hộp thoại ngoại lệ thời gian chạy .NET với thông tin hạn chế nhưng nó đề cập đến ngoại lệ này: Loại sự kiện: 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

Trả lời

2

Chỉ gặp sự cố này khi cố chạy Dịch vụ Windows (mà tôi đã viết). Dịch vụ sẽ chạy tốt trên môi trường thử nghiệm của tôi nhưng không chạy trên một máy khác.

Vấn đề hóa ra là máy phiền hà đang chạy Framework phiên bản 3.5 trong khi máy phát triển của tôi là 3.5 Service Pack 1. Nâng cấp máy lên SP1 đã khắc phục sự cố.

Hy vọng điều này sẽ giảm bớt nỗi đau của ai đó một chút.

+0

Cảm ơn, SP1 giống như giải pháp! – Keith

1

các MissingMethodException được ném bởi JITer (chỉ trong trình biên dịch thời gian) . Jitter biên dịch mã thành ngôn ngữ assembly một phương thức tại một thời điểm. Có một số phương thức bên trong phương thức ủy nhiệm (DisplayNextPicture) đang gọi một phương thức không tồn tại trong các thư viện trên máy đích, mà tôi đoán đang chạy phiên bản cũ hơn của .net. Kể từ khi jitter không thể tìm thấy phương pháp nó thổi lên.

Tôi đã thực hiện việc này vài lần khi xây dựng trên máy tính có cài đặt VS 2008 và 3.5 SP1 rồi thử chạy trên máy tính chỉ có 3.0 cài đặt. Đôi khi Microsoft sẽ thêm một phương thức vào các thư viện và không nâng cấp các phiên bản chính hoặc nhỏ của chúng. Thường thì điều này được thực hiện trong một trong các gói dịch vụ khung .net.

Đi qua mã trong phương thức ủy thác của bạn và xem MSDN trên bất kỳ phương thức nào và kiểm tra lại "Thông tin phiên bản" để xem phiên bản khung được hỗ trợ cho phương thức.

Bạn cũng có thể chỉ cần nâng cấp ứng dụng khách lên khung mới nhất nếu có thể.

1

Tôi đã gặp sự cố tương tự này. Tôi đã gọi quá tải của phương thức Dispatcher.Invoke không tồn tại trong phiên bản thực thi của .Net. Tôi tìm thấy một bình luận hữu ích tại MSDN về phương pháp đã giúp tôi mặc dù vấn đề của tôi là hơi khác nhau.

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

Nếu bạn đang sử dụng phương thức Invoke hãy thử sử dụng quá tải mà có DispatcherPriority vì nó là đối số đầu tiên.

3

Tôi đã sử dụng VS2008, .Net 3.5 và gặp sự cố tương tự khi bắt đầu luồng cho dịch vụ. Nâng cấp lên .Net 3.5 SP1 đã khắc phục sự cố. Cảm ơn các bạn đã giúp đỡ.

2

FWIW, tôi có hệ thống P9.sai số thiếu thừa nhận đã gây ra một ứng dụng đơn giản trên một số máy chứ không phải trên các máy khác. Tôi đã theo dõi nó xuống một dòng ".WaitOne (2000)" đang thực hiện bên trong một chuỗi. Không bao giờ gây ra một vấn đề trên máy tính của tôi, nhưng nó chắc chắn bị rơi trên những máy khác, NGAY CẢ MÃ MÃ KHÔNG BAO GIỜ ĐƯỢC THỰC HIỆN! Chủ đề thậm chí còn chưa đến được dòng đó. Sự cố xảy ra khi chương trình khởi động, điều này thực sự bực bội. Tôi thậm chí đã có một "try..catch" xung quanh dòng vấn đề của mã, và nó đã không giúp đỡ. Tôi đã ngừng sử dụng AutoResetEvent và đã sử dụng biến số và một "while(! signaled) { Thread.sleep(20); }, là một kludge, nhưng nó đã hoạt động ...

+0

Cảm ơn bạn. Điều này cực kỳ hữu ích và giúp xác định chính xác vấn đề tôi đang gặp phải. Đây là bài viết giải thích vấn đề và cách khắc phục tốt nhất. http://blog.darrenstokes.com/2009/03/30/watch-out-for-those-waitone-overloads-when-you-need-backwards-compatibility/ –

3

Tôi nhận được System.MissingMethodException khi thử nghiệm ứng dụng của mình, nhắm mục tiêu .NET 3.5, trên Windows XP SP3 Tôi đã kết thúc cài đặt Visual Studio 2008 Express để thử biên dịch ứng dụng ngay từ đầu, chỉ sau đó, trình biên dịch đã cho tôi lỗi có liên quan, nó bật lên rằng phương thức WaitOne trong AutoResetEvent chỉ có chữ ký với 2 tham số, do đó tôi phải viết lại :

reset.WaitOne(1000);

để

reset.WaitOne(1000, true);

Tôi đoán rằng Microsoft đã quên thêm quá tải đầu tiên vào bản phát hành .NET 3.5 của Windows XP. Bởi vì nó hoạt động, và tồn tại, trong Windows 7. Go hình.

Các vấn đề liên quan