2010-03-22 29 views
6

Tôi đang làm việc trên ứng dụng giao diện điều khiển .NET 3.5 trong C# sử dụng DLL không quản lý VC++. Nó chạy mà không có một vấn đề khi tôi làm việc trên nó một vài tuần trước, nhưng tôi đang trở lại với nó ngày hôm nay và bây giờ nhận được một BadImageFormatException ("Một nỗ lực đã được thực hiện để tải một chương trình với một định dạng không chính xác. (Ngoại lệ từ HRESULT: Máy trạm phát triển của tôi đang chạy 64bit Windows 7, và tôi thực hiện một số lượng công việc hợp lý với mã không được quản lý, vì vậy tôi đã ngay lập tức kiểm tra xem bộ sưu tập .NET và thư viện VC++ đều có mục tiêu x86 hay không.Nguyên nhân thay thế của BadImageFormatException trong .NET Assembly?

Chỉ để chắc chắn, tôi làm sạch và xây dựng lại VC++ thư viện và lắp ráp NET, vô ích.

Cả hệ thống đang làm bất cứ điều gì đặc biệt khác thường. các VC++ tải thư viện một dat nhị phân một tệp và thực hiện một số xử lý toán học về nội dung của nó. Việc lắp ráp NET có DllImports cho thư viện và một số mã để dây nó lên. Điều này tất cả đã làm việc một vài tuần trước đây.

Vì vậy, bây giờ tôi đang tự hỏi liệu có một số nguyên nhân khác của BadImageFormatException ít phổ biến hơn một xung đột x86/x64 mà tôi có thể đang chạy vào.

Cảm ơn.

EDIT: Tôi nhận được cùng một lỗi bất kể chế độ x86 hoặc x64, nhưng khi được đặt thành 'Bất kỳ CPU', thực thi vượt qua điểm đó, nhưng thực thi hủy bỏ cuộc gọi sau đó tới thư viện VC++ mà không có ngoại lệ. Bất kể điều đó có liên quan đến vấn đề này hay không, liệu có cái gì đó 'Bất kỳ CPU' nào khác với cả x86 và x64 có thể làm sáng tỏ điều này?

+0

Có cơ hội nào cho ứng dụng đang chạy có quyền truy cập vào phiên bản x64 của thư viện VC++ và đang cố gắng tải thay thế đó không? Hoặc, ứng dụng đang chạy của bạn có thể đang nhắm mục tiêu AnyCPU chứ không phải x86? AnyCPU sẽ được tải trong 64 bit nếu bạn sử dụng môi trường 64 bit. – Anzurio

+0

Câu hỏi hay. Trước đây không có vẻ như vậy, tôi đã thử sao chép dự án sang một máy khác chưa bao giờ có bất kỳ bản sao nào của thư viện trên đó, cẩn thận chỉ sao chép phiên bản x86 của hội đồng. Cùng một vấn đề đã xảy ra trên máy khác. Ứng dụng chắc chắn được đặt thành x86. Trong tò mò, tôi đặt nó chạy trong 'CPU bất kỳ'. Khi tôi làm điều đó, nó vượt qua cuộc gọi đầu tiên tới thư viện VC++ (nơi nó chết khi được đặt thành x86 hoặc x64) nhưng việc thực thi chấm dứt trong một cuộc gọi sau đó đến thư viện. –

+0

Chạy Dependency Walker x86 trên .exe của bạn và sau đó trên .dll của bạn. Tôi đã gặp sự cố này sau khi sao chép msvcr120.dll từ system32 trên máy 64 bit. Oy! –

Trả lời

3

Bạn có thể đang cố gắng tải lắp ráp được xây dựng cho CLR 4.0 trên CLR 2.0.

+0

Cảm ơn bạn đã phản hồi nhanh, nhưng chúng tôi không có bất kỳ cài đặt Visual Studio 2010 nào tại đây, vì vậy không có CLR 4.0. –

2

Khi bạn sử dụng mã gốc ở đây, tôi cho rằng vấn đề có thể xảy ra nhất ở đây là bạn đang cố gắng tải một DLL gốc như thể nó là một assembly .Net. Đây là một kịch bản sẽ sinh ra một số BadImageFormatException.

Hãy thử chạy ứng dụng của bạn và đặt ứng dụng này để giải quyết tình huống ném cho BadImageFormatException và xem tệp DLL nào đang được tải. Nếu đó là một bản địa thì đó là vấn đề.

4

Khi tôi nhận được lỗi này, nó luôn xảy ra khi tải một DLL 32 bit trong quy trình 64 bit.

Đặt tệp EXE để biên dịch thành x86 và xem tệp có hoạt động hay không.

+0

Như tôi đã nói trong câu hỏi ban đầu, mọi thứ được đặt thành x86. –

+0

Điều này đã giúp tôi, cảm ơn rất nhiều. – ChaosPandion

+0

Đã lưu giờ của tôi + – Xaqron

3

Kiểm tra xung đột tải .dll!

Tôi đã gọi một tệp C++/CLI từ C#; thư viện C++/CLI là một trình bao bọc xung quanh một dll gốc của bên thứ ba.

Hóa ra tôi có hai dll có cùng tên, cả trong đường dẫn (libeay32.dll).

Để tìm ra nguồn gốc của vấn đề tôi đã cài đặt cửa sổ công cụ gỡ lỗi: http://www.microsoft.com/whdc/devtools/debugging/default.mspx

Run 'gflags' (trong "c:... \ Program Files \ Debugging Tools" thư mục) để bật hiển thị trình tải "snaps"

tức là

> gflags -i <my test app.exe> +sls 

sau đó chạy ứng dụng bằng cdb (console debugger) hoặc windbg và rà soát thông qua đầu ra để tìm ra dll nào gây ra ngoại lệ.

ví dụ:

> cdb -g <my test app.exe> 

Đổi tên 'sai' libeay32.dll đã giải thích được sự cố nhưng chỉ là giải pháp tạm thời!

Phương pháp tìm lỗi tương tự cũng có thể phù hợp với bạn.

0

Trong trường hợp của tôi, tắt Enable unmanaged code debugging trong tab Gỡ lỗi thuộc tính dự án của EXE, thật trớ trêu, nếu nó được chọn.

Thành thật mà nói, tôi không chắc tại sao đó lại là nguyên nhân của vấn đề.

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