it-swarm-vi.com

"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

Tôi đang gọi các hàm từ 32 bit không được quản lý DLL 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 ở đó. Ngoài ra, nó sẽ không ném DllNotFoundException trong trường hợp đó chứ?

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

431
David Brown

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 hội, nhưng nó đã được sửa bằng khởi động lại.

123
David Brown

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.

enter image description here

503
bluwater2001

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

Project properties, build tab

trong Target Target chọn x86 (hay nói chung hơn là architecture để khớp với thư viện bạn đang liên kết đến)

Project properties, platform target

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

66
Marvin Thobejane

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.

49
Denis

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 và 2017

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

37
paibamboo

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

Đảm bảo bạn bỏ chọn tùy chọn này trong thuộc tính của dự án Build tab!

enter image description here

32
Drew Noakes

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.

8
StingyJack

Trong trường hợp của tôi, tôi đã sử dụng một DLL trong C #. Điều này DLL 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.

7
Tomasz Stypich

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ở lại 0yLjAuMC4w ở cuối dòng (00 trở về 0y)

3
Shaul Behr

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ả 32 bit và 64 bit DLL vào thư mục thử nghiệm. Chương trình đã ưu tiên 64-bit DLL 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
Mike Cluck

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 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 giải pháp Explorer, tại tab xây dựng, tôi chọn mục tiêu platfrom x86

2
asdf_enel_hak

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?

1
MilConDoin

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ẻ đúng DLL :)

1
Ludwo

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
Nateous

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
user1771386

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. Project Properties-> build

0
Joe

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ạn x86

Trong tệp csproj 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
Samir Banjanovic