Một nỗ lực đã được thực hiện để tải một chương trình có định dạng không chính xác ngay cả khi các nền tảng giống nhau


461

Tôi đang gọi các hàm từ một DLL không được quản lý 32 bit trên hệ thống 64 bit. Những gì tôi nhận được là:

BadImageFormatException: Một nỗ lực đã được thực hiện để tải một chương trình với định dạng không chính xác. (Ngoại lệ từ HRESULT: 0x8007000B)

Lúc đầu, tôi đã đặt các dự án của mình thành nền tảng Any CPU, vì vậy tôi đã thay đổi cả hai thành x86, nhưng lỗi này vẫn xảy ra. Đó thực sự là sửa chữa duy nhất tôi biết cho việc này.

Các DLL không bị hỏng hoặc bất cứ điều gì, bởi vì tôi có thể sử dụng chúng với các chương trình khác (mà tôi không có nguồn). Tôi nghĩ rằng có lẽ nó không tìm thấy sự phụ thuộc, nhưng tôi đã kiểm tra và tất cả đều ở đó. Thêm vào đó, nó sẽ không ném DllNotFoundExceptiontrong trường hợp đó chứ?

Tôi có thể làm gì nữa? Và trước khi bạn nói "Thay vào đó hãy sử dụng DLL không được quản lý 64 bit", hãy để tôi chỉ ra rằng không có. ;)


1
Những dự án bạn đã thay đổi thành x86? Và làm thế nào để bạn thực thi chúng khi bạn có ngoại lệ, thông qua trình gỡ lỗi hoặc thủ công? Nếu sau này, bạn có nhận thấy rằng khi bạn đổi thành x86, bạn đã có một thư mục mới trong thư mục bin \ của mình không? Về cơ bản bây giờ là bin \ x86 \ Gỡ lỗi cho các tệp.
Lasse V. Karlsen

Bạn có thể xác minh rằng tệp thực thi đang chạy ở chế độ 32 bit (* 32 trong trình quản lý quy trình) không?
JP Alioto

@Lasse V. Karlsen: Vâng, tôi đã loại bỏ x86 bit khỏi đường dẫn đầu ra khi tôi thay đổi nền tảng trong mỗi dự án. Dự án đầu tiên của tôi là một DLL bao bọc các chức năng trong DLL không được quản lý. Dự án thứ hai là một tệp thực thi sử dụng trình bao bọc trong DLL đầu tiên. Cả hai đều được đặt thành x86.
David Brown

@JP: Trên thực tế, trình quản lý quy trình không cho thấy nó đang chạy như một quy trình 32 bit. Tại sao vậy?
David Brown

Câu trả lời:


532

Nếu bạn cố chạy các ứng dụng 32 bit trên IIS 7 (và / hoặc máy OS 64 bit), bạn sẽ gặp lỗi tương tự. Vì vậy, từ IIS 7, nhấp chuột phải vào nhóm ứng dụng của ứng dụng và chuyển đến "cài đặt nâng cao" và thay đổi "Bật ứng dụng 32 bit" thành "TRUE".

Khởi động lại trang web của bạn và nó sẽ hoạt động.

nhập mô tả hình ảnh ở đây


1
Ôi ngày tôi đã câu cá xung quanh việc cài đặt thêm các thành phần IIS khi đây là câu trả lời ... Có ai có thể đề xuất một nhược điểm khi chọn tùy chọn này không?
notidaho

3
Đây là một cuộc thảo luận tốt về câu hỏi về hiệu suất liên quan đến vấn đề này: stackoverflow.com/questions/507820/NH
Ben Power

Tôi gặp sự cố với SharpSvn và điều này không có ích. :( Sth rất sai với hội đồng này, tôi nói với bạn ...
user2173353

4
Câu trả lời này là một wtf cho tôi, vì câu hỏi không đề cập đến IIS chút nào!
kristianp

129

Bằng cách nào đó, hộp kiểm Build trong Trình quản lý cấu hình đã không được chọn để thực thi của tôi, vì vậy nó vẫn chạy với bản dựng CPU cũ. Sau khi tôi sửa nó, Visual Studio phàn nàn rằng nó không thể gỡ lỗi lắp ráp, nhưng nó đã được sửa bằng khởi động lại.


Cảm ơn rất nhiều. Điều này cũng nhận được tôi. Đã kiểm tra bản dựng trong Trình quản lý cấu hình và bây giờ nó hoạt động (ứng dụng máy tính để bàn WPF).
danglund

1
Nếu bạn đã thực hiện tất cả các cách trên và kiểm tra cài đặt nền tảng của mình, xây dựng cài đặt cấu hình, làm sạch giải pháp và nó vẫn không hoạt động - tìm kiếm tất cả các phiên bản của DLL và xóa chúng.
Will Calderwood

với VS 2015 này vẫn còn hiệu lực - mặc dù tôi đã không cần phải khởi động lại :)
increddibelly

Đó là nó! Truy cập lại cài đặt Trình quản lý cấu hình của bạn là câu trả lời.
AndyUK

74

Trong Visual Studio , Nhấp chuột phải vào dự án của bạn -> Trên khung bên trái, nhấp vào tab Build ,

Thuộc tính dự án, xây dựng tab

trong Mục tiêu nền tảng, chọn x86 (hay nói chung là kiến trúc phù hợp với thư viện bạn đang liên kết đến)

Thuộc tính dự án, mục tiêu nền tảng

Tôi hi vọng điêu nay se giup được ai đo! :)


2
Điều này đã khắc phục sự cố của tôi trong VS2013, tôi đã tìm thấy một cách khắc phục khác là để "Mục tiêu nền tảng" là "Bất kỳ CPU" nào nhưng kiểm tra hộp kiểm "Thích 32 bit".
dùng1069816

2
Mặc dù bạn cần sử dụng .NET 4.5 trở lên để có thể kiểm tra hộp kiểm "Thích 32 bit"
user1069816

1
Có, nhưng tôi đã chuyển đổi dự án của mình trong 'Bất kỳ CPU' thành 'x64'. Dự án 32 bit của tôi hoạt động tốt nhưng cùng mã tôi đã chuyển đổi thành 64 bit, dự án đó không hoạt động tốt như 32 bit. Bạn có thể vui lòng cho tôi quy trình chuyển đổi 64 bit thích hợp không ...
Ismayil S

@IsmayilS đảm bảo bạn đang sử dụng phiên bản 64 bit của thư viện mà bạn đang liên kết đến
Marvin Thobejane

53

Tôi cũng có vấn đề này. Đã thử tất cả các đề xuất ở đây, nhưng họ đã không giúp đỡ.

Tôi tìm thấy một thứ khác để kiểm tra nó đã sửa nó cho tôi. Trong Visual Studio, nhấp chuột phải vào dự án và mở "Thuộc tính". Nhấp vào tab "Biên dịch" (hoặc "Xây dựng") và sau đó nhấp vào "Tùy chọn biên dịch nâng cao" ở dưới cùng.

Kiểm tra thả xuống "CPU mục tiêu". Nó phải phù hợp với "Nền tảng" bạn đang xây dựng. Đó là, nếu bạn đang xây dựng "Bất kỳ CPU" thì "CPU mục tiêu" sẽ nói "Bất kỳ CPU nào". Đi qua tất cả các Nền tảng của bạn bằng cách kích hoạt chúng và kiểm tra cài đặt này.


2
Và đối với những người trong chúng ta chỉ sử dụng trình biên dịch, cách khắc phục của tôi là thêm "/ platform: x86" vào các cờ biên dịch.
Urchin

Điều này đã sửa nó cho tôi là tốt. Tôi đã phải điều chỉnh "mục tiêu nền tảng" trên tab "Xây dựng".
Jowen

nếu bạn đang trên 64 bit, hãy kiểm tra cờ "thích 32 bit". Tôi đã phải vô hiệu hóa nó cho tôi.
N4ppeL

51

Nếu bạn gặp phải lỗi này khi bạn nhấp vào nút mũi tên màu xanh lá cây để chạy ứng dụng, nhưng vẫn muốn chạy ứng dụng trong 64 bit. Bạn có thể làm điều này trong VS 2013, 2015, 2017 và 2019

Truy cập: Công cụ> Tùy chọn> Dự án và Giải pháp> Dự án web> Sử dụng phiên bản 64 bit của IIS Express


3
Cảm ơn. Tôi đã cố gắng rất nhiều và không có gì giúp được. Bạn là cứu tinh của tôi Tôi có hệ điều hành 64 bit, đã cài đặt một studio Visual 64 bit [vẫn chạy như 32 bit mà không rõ lý do]. Khi tôi đặt Mục tiêu nền tảng của mình thành x64, nó đã bị lỗi BadImageFormatException. Với sửa chữa của bạn, nó đã làm việc. Tôi đã cho bạn một upvote. Bạn đá
SKCS Kamal

Tôi rất vui vì tôi có thể giúp :)
paiblyn

Đây là câu trả lời tôi cần. Cảm ơn rất nhiều!
yushulx

Cảm ơn rất nhiều, điều này đã giải quyết vấn đề. Nó hoạt động tốt với quy trình 32-bit của Visual Studio 2017.
samir105

1
vẫn hoạt động với VS 2019, cảm ơn bạn
Jake Gaston

36

Nếu bạn đang sử dụng Bất kỳ CPU nào , bạn có thể gặp phải sự cố này nếu tùy chọn Ưu tiên 32 bit được chọn:

Hãy chắc chắn rằng bạn bỏ chọn tùy chọn này trong tab Build của thuộc tính của dự án !

nhập mô tả hình ảnh ở đây


3
Sẽ rất hữu ích nếu bạn có thể chỉ ra nơi trong Visual Studio để tìm tùy chọn này.
phân ly

@trysis, tùy chọn này nằm trong trang Build của khung cài đặt dự án.
Drew Noakes

1
Tôi đã nói rằng sẽ rất hữu ích khi đặt nó vào. Vì câu trả lời này là không có ngữ cảnh để nói với người dùng không may, có thể là người mới của StackOverflow tìm thấy nó ở đâu.
phân chia

Con đường để có được hình thức này là gì? Tôi không thể tìm thấy nó
Adolfo Correa

Trong Visual Studio, nhấp chuột phải vào dự án và chọn 'Thuộc tính'.
Drew Noakes

8

Một chút lạc đề cho bài viết này, nhưng tìm kiếm thông báo lỗi này đã đưa tôi đến đây.

Nếu bạn đang xây dựng thông qua hệ thống nhóm và gặp lỗi này, tab quy trình định nghĩa bản dựng có cài đặt "Nền tảng MSBuild". Nếu điều này được đặt thành "Tự động", bạn có thể gặp sự cố này. Thay đổi nó thành "X86" cũng có thể khắc phục lỗi.


đây là câu trả lời gần nhất với những gì tôi đã trải qua Tôi đã có một dll phải là x86. Tôi đã sử dụng nó trong một dự án khác, đó là AnyCPU theo mặc định. Họ chỉ cần phù hợp. Trong trường hợp này, nó không tạo ra nhiều khác biệt, vì vậy tôi đã thay đổi dự án mới thành x86.
greg

8

Trong trường hợp của tôi, tôi đã sử dụng một DLL gốc trong C #. DLL này phụ thuộc vào một vài DLL khác bị thiếu. Một khi các DLL khác được thêm vào, mọi thứ đều hoạt động.


4

Dựa trên câu trả lời của @paiblyn

Anh ấy nói: Truy cập: Công cụ> Tùy chọn> Dự án và Giải pháp> Dự án web> Sử dụng phiên bản 64 bit của IIS Express

Đồng nghiệp của tôi đã kiểm tra hộp này (anh ấy rõ ràng đã tìm nó), nhưng có thông báo lỗi trong câu hỏi. Sau vài giờ, anh bỏ chọn hộp và kiểm tra lại. Lo và kìa: Mã bây giờ chạy với thành công.

Dường như, có hai nơi mà trạng thái của hộp này được lưu không đồng bộ. Hủy và kiểm tra lại nó đã đồng bộ hóa nó một lần nữa.

Câu hỏi cho người dùng hiểu biết nhiều hơn: Có bản cập nhật hoặc thứ gì đó vào tuần trước (cho VS 2015) đã hủy đồng bộ hóa các trạng thái không?


3

Cũng xem câu trả lời này , giải quyết vấn đề tương tự cho tôi.

Được đăng bởi Luis Mack vào ngày 5/12/2010 lúc 8:50 sáng Tôi đã tìm thấy vấn đề tương tự, chỉ dành cho một dự án cụ thể khi biên dịch trên máy 64 bit. Một cách khắc phục mà SEEMS hoạt động là thay đổi thủ công một ký tự trong luồng hình ảnh MERYI LẦN điều khiển người dùng hoặc biểu mẫu được chỉnh sửa trong trình thiết kế

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w

Thay đổi thành

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w

Đó là 00LjAuMC4w trở về 0yLjAuMC4w ở cuối dòng (00 trở về 0y)


1
Một bản tóm tắt ngắn gọn về liên kết sẽ hữu ích @Shaul :)
Marvin Thobejane

Lộng lẫy. Cảm ơn, cuộc họp ngắn thêm nội dung vào bình luận của bạn
Marvin Thobejane

2

Trong trường hợp của tôi, tôi đang sử dụng một .exe nhỏ để tải lại các DLL được tham chiếu thông qua Reflection. Vì vậy, tôi chỉ làm những bước này giúp tiết kiệm trong ngày của tôi:

Từ thuộc tính dự án trên trình khám phá giải pháp, tại tab xây dựng, tôi chọn mục tiêu platfrom x86


2

Trong trường hợp của tôi, tôi đã chạy thử nghiệm thông qua MSTest và phát hiện ra rằng tôi đang triển khai cả DLL 32 bit và 64 bit vào thư mục thử nghiệm. Chương trình đã ủng hộ DLL 64 bit và khiến nó bị lỗi.

TL; DR Đảm bảo bạn chỉ triển khai DLL 32 bit để kiểm tra.


2

Chúng tôi đã gặp sự cố tương tự và chúng tôi đã cố gắng khắc phục bằng cách đặt mục tiêu Nền tảng thành x86. Thuộc tính dự án-> xây dựng


Vậy x86 dlls khác với x64? Có cách nào để phát hiện điều này trên một tập tin dll được tham chiếu không?
NoBugs

@NoBugs Hình như bạn có thể. Hãy xem chủ đề
Joe

1

Tôi đã giải quyết vấn đề này theo cách 'Windows'. Sau khi kiểm tra tất cả các cài đặt của tôi, làm sạch giải pháp và xây dựng lại nó, tôi chỉ cần đóng giải pháp và mở lại. Sau đó, nó hoạt động, vì vậy VS có thể đã không loại bỏ một số thứ trong khi làm sạch. Khi các giải pháp logic không hoạt động, tôi thường chuyển sang các giải pháp phi logic (hoặc dường như phi logic). Windows không làm tôi thất vọng. :)


1

Tôi đã có thể khắc phục sự cố này bằng cách khớp phiên bản xây dựng của tôi với phiên bản .NET trên máy chủ.

Tôi nhấp đúp vào .exe chỉ để xem điều gì sẽ xảy ra và nó bảo tôi cài đặt 4.5 ....

Vì vậy, tôi đã hạ xuống 4.0 và nó đã hoạt động!

Vì vậy, hãy chắc chắn rằng phiên bản của bạn phù hợp. Nó chạy trên hộp dev của tôi tốt, nhưng máy chủ có phiên bản .NET cũ hơn.


1

Trong trường hợp của tôi đó là nội dung sai của tập tin. DLL đã được tải xuống từ web, nhưng nội dung của DLL là trang HTML: D Hãy thử kiểm tra xem đó có phải là tệp nhị phân không, nếu nó có vẻ như là DLL chính xác :)


1

Chúng tôi đã có cùng một vấn đề trong lõi .NET. Giải pháp là tải xuống thời gian chạy .netcore 32 bit và có mục tiêu dự án của bạnx86

Trong csprojtập tin của bạn thêm

  <PropertyGroup>
    <PlatformTarget>x86</PlatformTarget>  
  </PropertyGroup>

  <PropertyGroup>
    <RunCommand Condition="'$(PlatformTarget)' == 'x86'">$(MSBuildProgramFiles32)\dotnet\dotnet</RunCommand>    
  </PropertyGroup>

Cái này được sử dụng cho máy Windows, bạn phải điều chỉnh đường dẫn và như vậy cho Linux / OSX


0

Nếu bạn đang nhập DLL không được quản lý thì hãy sử dụng

CallingConvention = CallingConvention.Cdecl 

trong phương thức nhập DLL của bạn.


0

1: Truy cập: Công cụ> Tùy chọn> Dự án và Giải pháp> Dự án web> Sử dụng phiên bản 64 bit của IIS Express 2: thay đổi cài đặt bên dưới cho dự án dịch vụ web. nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.