2012-12-21 11 views
7

Theo MSDN documentation,Assembly.LoadFrom BadImageFormatException - hành vi khác nhau trong .NET 4.0 và 4.5 (có thể không có giấy tờ)

public static Assembly LoadFrom(string assemblyFile) 

ném BadImageFormatException nếu

assemblyFile is not a valid assembly. 
-or- 
Version 2.0 or later of the common language runtime is currently loaded 
and assemblyFile was compiled with a later version. 

Trên thực tế, có một trường hợp phụ - tải lắp ráp được xây dựng cho x86 từ lắp ráp chạy trong chế độ x64. Có lẽ nó được bao gồm trong "không phải là một hội đồng hợp lệ" tuyên bố, tôi không biết. Nhưng đây là nguyên nhân hợp lý của ngoại lệ.

Ok, nhưng trong .NET 4.5 thì không! Tôi có một ứng dụng .NET 4.5 WPF, tải các ứng dụng khác nhau vì một số lý do. Nó được xây dựng cho bất kỳ CPU và tôi bắt đầu nó trên x64 Win 7. Tôi đã thử nghiệm nó trên một thực thi, được xây dựng cho .NET 4.0 x86, và nó hoạt động tốt. Nhưng khi tôi chuyển ứng dụng của tôi sang .NET 4.0, nó bắt đầu sụp đổ theo phương pháp Assembly.Load!

Vì vậy, câu hỏi của tôi là, tôi có thiếu gì đó không? Nếu không, sau đó làm thế nào họ làm điều đó - tải x86 lắp ráp từ quá trình x64 trong .NET 4.5? Tôi đang thiếu một số hiểu biết vào thời điểm này.

Cập nhật

Nhờ Hans passant, tôi đã tìm ra sai lầm của tôi. Thực tế, hành vi của Assembly.Loadkhông khác nhau. Nó bật ra, tôi đã không thông báo Prefer 32-bit tùy chọn trong cài đặt dự án (hoặc Prefer32Bit thẻ trong tập tin .csproj). Đó là lý do tại sao quy trình của tôi trong .NET 4.5 ran in a 32-bit mode. Cài đặt này là đúng khi tôi tạo dự án .NET 4.5 WPF. Sau đó, khi tôi chuyển sang .NET 4.0, nó trở nên không hoạt động vì không có tùy chọn như vậy trong .NET 4.0. Và khi tôi chuyển trở lại .NET 4.5, nó trở thành false, vì vậy, tôi đoán, cho mục đích tương thích.

+0

"khi tôi chuyển ứng dụng sang .NET 4.0", ý bạn là .NET 4.5? ;) – HericDenis

+0

Không, ban đầu nó được xây dựng cho 4.5, nhưng sau đó chúng tôi nhận ra rằng chúng tôi cần nó để làm việc trên 4.0 – EvAlex

+0

Nếu đây là một vấn đề thời gian chạy, nó không liên quan cụ thể đến các trình biên dịch được xuất xưởng của các phiên bản đó. Không được gắn thẻ. – leppie

Trả lời

2

Hãy xóa một giả định khỏi bảng một cách nhanh chóng, không có cách nào có thể có hành vi khác nhau trên máy đã cài đặt .NET 4.5. Nhắm mục tiêu 4.0 không có sự khác biệt trong thời gian chạy. Điều duy nhất làm là chọn một tập hợp tham chiếu khác nhau, chúng ngăn bạn vô tình sử dụng một lớp có sẵn trên .NET 4.5 nhưng không phải trên .NET 4.0.

Không có cách nào để cài đặt cả 4.0 và 4.5 trên cùng một máy. .NET 4.5 không phải là phiên bản side-by-side của .NET framework, như 3.5 và 4.0 là side-by-side. Cài đặt 4,5 thay thế phiên bản 4.0 đã cài đặt. CLR, jitter, tất cả các assembly thời gian chạy cộng với trình biên dịch C#.

Tốt nhất nên tập trung vào thiết lập mục tiêu nền tảng của dự án EXE của bạn, đó là một trong đó chọn độ bit của quy trình. Loại lỗi mà bạn có thể thực hiện là quên rằng cài đặt có thể khác với Debug so với bản dựng Bản phát hành. Và giả sử rằng combobox "Active solution platform" trong Build + Configuration Manager có hiệu lực. Nó không, chỉ có các thuộc tính Project + Properties, Build, Platform. Đây là một cái bẫy rất khó xử mà nhiều lập trình viên đã rơi vào.

+1

Cảm ơn bạn đã trả lời chi tiết! Thực ra, tôi biết cách thiết lập đúng nền tảng đích cho dự án. Nhưng câu trả lời của bạn đã giúp tôi theo dõi nguyên nhân của vấn đề của tôi. Vì vậy, bây giờ tôi đang cập nhật câu hỏi của tôi với giải thích về vấn đề và đánh dấu câu trả lời của bạn là câu trả lời chính xác. Tôi đang làm ở đây phải không? – EvAlex