Khắc phục sự cố BadImageFormatException


107

Tôi có một dịch vụ Windows được viết bằng C # sử dụng Visual Studio 2010 và nhắm mục tiêu .NET Framework 4. Khi tôi chạy từ bản dựng Gỡ lỗi, dịch vụ sẽ chạy như mong đợi. Tuy nhiên, khi tôi chạy nó từ bản phát hành, tôi nhận được System.BadImageFormatException (chi tiết bên dưới). Tôi đã tìm kiếm trên Internet để tìm giải pháp nhưng cho đến nay mọi thứ tôi tìm thấy vẫn chưa giúp tôi tìm ra giải pháp.

Sự cố tồn tại trên cả hệ thống Windows 7 64-bit (nhà phát triển) và Windows XP SP3 32-bit (đích).

Đây là những gì tôi đã thử cho đến nay:

  • Tất cả các cài đặt bản dựng đã xác minh như Mục tiêu nền tảng đều giống nhau (x86).
  • Đã sử dụng peverify với tùy chọn / verbose để đảm bảo mã nhị phân hợp lệ là hợp lệ.
  • Sử dụng fuslogvw để tìm kiếm bất kỳ sự cố tải nào.
  • Đã sử dụng CheckAsm để tìm kiếm các tệp hoặc tập hợp bị thiếu.

Tất cả các kiểm tra này không thay đổi bất cứ điều gì. Tôi đã bao gồm toàn bộ văn bản của thông tin ngoại lệ bên dưới, với một số tên đã được thay đổi để bảo vệ bí mật của các chủ công ty của tôi.

System.BadImageFormatException không được xử lý
  Thông báo = Không thể tải tệp hoặc lắp ráp 'XxxDevices, Phiên bản = 1.0.0.0, Văn hóa = trung lập, PublicKeyToken = null' hoặc một trong các phụ thuộc của nó. Đã cố gắng tải một chương trình có định dạng không chính xác.
  Nguồn = XxxDevicesService
  FileName = XxxDevices, Phiên bản = 1.0.0.0, Văn hóa = trung lập, PublicKeyToken = null
  FusionLog = Trình quản lý lắp ráp được tải từ: C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ clr.dll
Chạy trong c: \ Dev \ TeamE \ bin \ Release \ XxxDevicesService.vshost.exe
--- Một bản ghi lỗi chi tiết sau đây. 

=== Thông tin trạng thái ràng buộc trước ===
ĐĂNG NHẬP: Người dùng = XXX
ĐĂNG NHẬP: DisplayName = XxxDevices, Phiên bản = 1.0.0.0, Văn hóa = trung lập, PublicKeyToken = null
 (Được chỉ định đầy đủ)
LOG: Appbase = file: /// c: / Dev / TeamE / bin / Release /
LOG: Đường dẫn riêng ban đầu = NULL
Gọi lắp ráp: XxxDevicesService, Phiên bản = 1.0.0.0, Văn hóa = trung lập, PublicKeyToken = null.
===
LOG: Liên kết này bắt đầu trong ngữ cảnh tải mặc định.
ĐĂNG NHẬP: Sử dụng tệp cấu hình ứng dụng: c: \ TeamE \ bin \ Release \ XxxDevicesService.vshost.exe.Config
ĐĂNG NHẬP: Sử dụng tệp cấu hình máy chủ: 
ĐĂNG NHẬP: Sử dụng tệp cấu hình máy từ C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ config \ machine.config.
LOG: Chính sách không được áp dụng cho tham chiếu tại thời điểm này (ràng buộc lắp ráp riêng tư, tùy chỉnh, một phần hoặc dựa trên vị trí).
ĐĂNG NHẬP: Đang cố tải xuống tệp URL mới: /// c: /TeamE/bin/Release/XxxDevices.DLL.
ERR: Không thể hoàn tất thiết lập lắp ráp (hr = 0x8007000b). Đã kết thúc việc thăm dò.

  StackTrace:
       tại XxxDevicesService.Program.Main (String [] args)
       tại System.AppDomain._nExecuteAssembly (RuntimeAssembly, String [] args)
       tại Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly ()
       tại System.Threading.ExecutionContext.Run (ExecutionContext thi hànhContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       tại System.Threading.ExecutionContext.Run (ExecutionContext thực thiContext, ContextCallback callback, Object state)
       tại System.Threading.ThreadHelper.ThreadStart ()
  Nội ngoại lệ: 
c#  .net  exception 

bạn có đang trộn mã gốc / .net không?
Keith Nicholas

1
Bạn đang đi đúng hướng rằng ngoại lệ này có liên quan đến sự khác biệt bit x86 / x64. Tôi cho rằng đây không phải là một ứng dụng web phải không? Ngoài ra, kiểu lắp ráp là XxxDevicesServicegì? Nó có được biên dịch cho một nền tảng cụ thể (ví dụ: 32 bit) không? Nếu vậy, bạn phải biên dịch nền tảng của mình thành 32 bit.
Reddog

Câu trả lời:


121

Tất cả các cài đặt bản dựng đã xác minh như Mục tiêu nền tảng đều giống nhau (x86).

Đó không phải là những gì nhật ký sự cố nói:

Trình quản lý lắp ráp được tải từ: C: \ Windows \ Microsoft.NET \ Framework64

Lưu ý 64 trong tên, đó là quê hương của phiên bản 64-bit của khung. Đặt cài đặt nền tảng Mục tiêu trên dự án EXE của bạn , không phải dự án thư viện lớp của bạn. Dự án XxxDevicesService EXE xác định bitness của quá trình.


6
Và trong khi bạn đang kiểm tra dự án EXE, hãy kiểm tra cả Gỡ lỗi Phát hành. : /
chris

44

Sau khi tôi ngừng đập đầu vào bàn và suy nghĩ về cả tuần tôi đã dành để giải quyết vấn đề này, tôi đang chia sẻ những gì hiệu quả với tôi. Tôi có Win7 64 bit, Oracle Client 32 bit và có dự án MVC 5 của tôi được thiết lập để chạy trên nền tảng x86 vì tính năng bit của Oracle. Tôi tiếp tục nhận được các lỗi tương tự:

Không thể tải tệp hoặc lắp ráp 'Oracle.DataAccess' hoặc một trong các phụ thuộc của nó. Đã cố gắng tải một chương trình có định dạng không chính xác.

Tôi đã tải lại các gói NuGet, tôi đã sử dụng bản sao của các tệp DLL hoạt động cho những người khác trong các ứng dụng khác nhau, tôi đặt codebase trong assembly phụ thuộc để trỏ đến thư mục bin của dự án của tôi, tôi đã thử CopyLocal là đúng hay sai, tôi đã thử mọi thứ. Cuối cùng, tôi đã làm đủ việc khác, tôi muốn kiểm tra mã của mình và với tư cách là một nhà thầu mới, tôi không thiết lập lật đổ. Trong khi tìm cách kết nối nó vào VS, tôi vấp phải câu trả lời. Những gì tôi thấy đã hoạt động là bỏ chọn tùy chọn "Sử dụng phiên bản 64 bit của IIS Express cho Trang web và Dự án" trong phần Dự án và Giải pháp => Dự án Web trong trình đơn Công cụ => Tùy chọn.


3
Thật là một tiết kiệm cuộc sống !! Cảm ơn bạn. Đối với tôi, tôi đã phải thực sự kiểm tra điều này, vì dự án của tôi có hiệu quả là x64. Cảm ơn một lần nữa !!!
viper

Sau tất cả sự giúp đỡ mà tôi đã nhận được ở đây, tôi rất vui vì đã có thể trả một phần trong số đó!
Joseph Morgan,

3
Đối với những người sử dụng Local IIS, hãy đảm bảo rằng "Bật ứng dụng 32-bit" của nhóm ứng dụng của bạn (trong Cài đặt nâng cao) được đặt thành Đúng .
Eric Eskildsen

Một phần bổ trợ cho nhận xét của @ EricEskildsen ở trên về "bật ứng dụng 32-bit" trong nhóm ứng dụng, ngay cả khi bạn không muốn làm điều đó trong môi trường trực tiếp, việc lật công tắc đó có thể cung cấp thêm manh mối về việc bạn đang đối mặt với 32 -bit / 64-bit vấn đề hoặc cái gì khác.
CVn

Bùm! Điều đó là vậy đó.
itlittlejohn

21

Những gì tôi thấy đã hoạt động là kiểm tra tùy chọn "Sử dụng phiên bản 64 bit của IIS Express cho Trang web và Dự án" trong phần Dự án và Giải pháp => Dự án Web trong trình đơn Công cụ => Tùy chọn.


bạn là vị cứu tinh. +1
Amit Kumar

Tôi đã cài đặt lại VS và đang khắc phục sự cố này (cảm ơn bạn - giải pháp này đã hoạt động). Đạo đức của câu chuyện đối với tôi là nếu tôi biết tôi đã không thay đổi bất kỳ mã nào để bắt đầu, có lẽ tôi nên xem cấu hình của VS trước.
taylorswiftfan

@Lucy hộp kiểm 'Sử dụng phiên bản 64 bit của IIS Express cho các trang web và dự án' bị tắt
k_kumar

Hãy nói với Lucy
k_kumar

12

Nó thường có thể xảy ra khi bạn thay đổi khung mục tiêu của .csproj và hoàn nguyên nó về những gì bạn đã bắt đầu.

Đảm bảo 1 nếu được hỗ trợRuntime version = "thời gian chạy khác với mục tiêu dự án cs" trong thẻ khởi động trong app.config.

Đảm bảo 2 Điều đó cũng có nghĩa là kiểm tra các tệp khác được tạo tự động hoặc các tệp khác trong có thể là thư mục thuộc tính để xem liệu không còn thời gian chạy nào không khớp giữa các tệp này và tệp được xác định trong tệp .csproj.

Những điều này có thể chỉ giúp bạn tiết kiệm rất nhiều thời gian trước khi bạn bắt đầu thử những thứ khác nhau với các thuộc tính của dự án để khắc phục lỗi.


Tôi đã gặp một vấn đề tương tự và câu trả lời của bạn là giải pháp cho tôi. App.config của tôi có thời gian chạy được hỗ trợ khác nhau.
Krisztián Kis

9

Tôi đã gặp vấn đề tương tự mặc dù tôi có Windows 7 64 bit và tôi đang tải b / c DLL 64 bit trong thuộc tính Dự án | Bản dựng Tôi đã chọn "Ưu tiên 32-bit". (Không biết tại sao điều đó được đặt theo mặc định). Khi tôi bỏ chọn điều đó, mọi thứ đều chạy tốt


1
Ở đây cũng vậy. Điều này đã thực hiện thủ thuật. Đã tham chiếu đến một tổ hợp 64-bit và cấu hình bản dựng đang hoạt động được đặt thành Bất kỳ CPU nào nhưng do cài đặt "thích 32-bit hơn" này, giả sử 32-bit đã được sử dụng để chạy ứng dụng và gây ra sự cố.
Bernoulli IT

Đã chọn Bất kỳ CPU nào thay vì x86 ở chế độ Gỡ lỗi và hoạt động như một sự quyến rũ.
Cardi DeMonaco Jr

7

Bạn cũng có thể nhận được ngoại lệ này khi ứng dụng của bạn nhắm mục tiêu .NET Framework 4.5 (ví dụ) và bạn có app.config sau:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v2.0.50727" />
    <supportedRuntime version="v4.0" />
  </startup>
</configuration>

Khi cố gắng khởi chạy gỡ lỗi của ứng dụng, bạn sẽ nhận được BadImageFormatException.

Loại bỏ dòng khai báo phiên bản v2.0 sẽ xóa lỗi.

Tôi đã gặp sự cố này gần đây khi tôi cố gắng thay đổi nền tảng mục tiêu từ một dự án .NET 2.0 cũ thành .NET 4.5.


6

Lý lịch

Chúng tôi bắt đầu nhận được điều này hôm nay khi chúng tôi chuyển dịch vụ WCF từ AnyCPU sang x64 trên máy chủ Windows 2012 R2 chạy IIS 6.2.

Đầu tiên, chúng tôi đã kiểm tra hội đồng tham chiếu duy nhất 10 lần, để đảm bảo rằng nó không thực sự là một dll x86. Tiếp theo, chúng tôi đã kiểm tra nhóm ứng dụng nhiều lần để đảm bảo rằng nó không kích hoạt các ứng dụng 32 bit.

Theo ý muốn, tôi đã thử chuyển đổi cài đặt. Hóa ra các nhóm ứng dụng trong IIS được mặc định thành giá trị Bật ứng dụng 32-bit là Sai, nhưng IIS đã bỏ qua nó trên máy chủ của chúng tôi vì một số lý do và luôn chạy dịch vụ của chúng tôi ở chế độ x86.

Giải pháp

  • Chọn nhóm ứng dụng.
  • Chọn Set Application Pool Defaults ... hoặc Advanced Settings ... .
  • Thay đổi Bật ứng dụng 32-bit thành Đúng.
  • Bấm OK .
  • Chọn lại Đặt mặc định cho nhóm ứng dụng ... hoặc Cài đặt nâng cao ... một lần nữa.
  • Thay đổi Bật ứng dụng 32-bit trở lại Sai.
  • Bấm OK .

4

Tôi đã khắc phục sự cố này bằng cách thay đổi ứng dụng web để sử dụng "Nhóm ứng dụng" khác.


4

Đối với bất kỳ ai có thể đến đây muộn hơn .... Không có gì hiệu quả với tôi. Tất cả các tổ hợp của tôi đều ổn. Tôi có một cấu hình ứng dụng trong một trong các Dự án Visual Studio của tôi mà lẽ ra không có ở đó. Vì vậy, hãy đảm bảo rằng tệp cấu hình ứng dụng của bạn là cần thiết.

Tôi đã xóa cấu hình ứng dụng bổ sung và nó hoạt động.


Đã sửa nó cho tôi. App.config của tôi đã đặt ứng dụng .NET 4.5.1 của tôi thành 2.0 CLR!
Jared Thirsk

4

Target build x64 Target Server Hosting IIS 64 Bit

Nếu bản dựng ứng dụng đang nhắm mục tiêu Hệ điều hành 64-Bit thì trên máy chủ 64-Bit lưu trữ IIS, Hãy đặt bật ứng dụng 32 bit trên nhóm ứng dụng đang chạy trang web / ứng dụng web thành false.

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


2

Xác định nhóm ứng dụng được ứng dụng sử dụng và đặt thuộc tính của bằng cách đặt Bật ứng dụng 32 bit thành Đúng. Điều này có thể được thực hiện thông qua cài đặt trước của nhóm ứng dụng.


2

Khi xây dựng ứng dụng cho nền tảng 32 bit hoặc 64 bit (Kinh nghiệm của tôi là với Visual Studio 2010), không dựa vào Trình quản lý cấu hình để đặt nền tảng chính xác cho tệp thực thi. Ngay cả khi CM đã chọn x86 cho ứng dụng, hãy kiểm tra các thuộc tính của dự án (tab Build): nó vẫn có thể thông báo "Bất kỳ CPU nào" ở đó. Và nếu bạn chạy tệp thực thi "Bất kỳ CPU nào" trên nền tảng 64-bit, nó sẽ chạy ở chế độ 64-bit và từ chối tải các tệp DLL đi kèm của bạn được xây dựng cho nền tảng x86.


1

Loại bỏ sự phụ thuộc của bạn vào System.Runtime trong Web.Config của bạn, nó phù hợp với tôi:

<dependentAssembly>
        <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
</dependentAssembly>

Đối với tôi đó là System.Net.Http. Cảm ơn cho nó.
Snickbrack

1

Đối với .NET Core , có một lỗi Visual Studio 2017 có thể khiến trang Xây dựng thuộc tính dự án hiển thị mục tiêu nền tảng không chính xác. Một khi bạn phát hiện ra vấn đề, các giải pháp khắc phục khá dễ dàng. Bạn có thể thay đổi mục tiêu thành một số giá trị khác và sau đó thay đổi lại.

Ngoài ra, bạn có thể thêm số nhận dạng thời gian chạy vào .csproj. Nếu bạn cần .exe của mình chạy dưới dạng x86 để nó có thể tải một DLL gốc x86, hãy thêm phần tử này trong một PropertyGroup:

<RuntimeIdentifier>win-x86</RuntimeIdentifier>

Một nơi tốt để đặt điều này là ngay sau phần tử TargetFrameworkhoặc TargetFrameworks.


1

Tôi ngạc nhiên là không có ai khác đã đề cập đến điều này vì vậy tôi sẽ chia sẻ trong trường hợp không có sự trợ giúp nào ở trên (trường hợp của tôi).

Điều gì đang xảy ra là một phiên bản VBCSCompiler.exe bằng cách nào đó bị kẹt và trên thực tế là không giải phóng các xử lý tệp để cho phép các phiên bản mới ghi chính xác các tệp mới và đang gây ra sự cố. Điều này trở nên rõ ràng khi tôi cố gắng xóa thư mục "bin" và nó đã phàn nàn rằng một quá trình khác đang sử dụng các tệp trong đó.

Đóng VS, mở trình quản lý tác vụ, xem xét và kết thúc tất cả các phiên bản VBCSCompiler và xóa thư mục "bin" để quay lại vị trí của tôi.

Tham khảo: https://developercommunity.visualstudio.com/content/problem/117596/vbcscompilerexe-process-stays-runing- after-exiting.html


Giải pháp của tôi cũng là xóa tất cả các thư mục bin và gỡ lỗi.
gabnaim

0

Đối với bất kỳ ai có thể đến đây muộn hơn ...
Đối với giải pháp Máy tính để bàn, tôi có BadImageFormatExceptionngoại lệ.
Tất cả các tùy chọn xây dựng của dự án đều ổn (tất cả x86). Nhưng dự án StartUp của giải pháp đã được thay đổi thành một số dự án khác (dự án thư viện lớp).

Thay đổi dự án StartUp thành dự án ban đầu (dự án ứng dụng .exe) là một giải pháp trong trường hợp của tôi


0

Khi tôi gặp phải vấn đề này, những điều sau đã giải quyết cho tôi:

Tôi đang gọi một dll OpenCV từ bên trong exe khác, dll của tôi không chứa các dll opencv vốn đã cần thiết như highgui, features2d, v.v. có sẵn trong thư mục của tệp exe của tôi. Tôi đã sao chép tất cả những thứ này vào thư mục của dự án exe của mình và nó đột nhiên hoạt động.


0

Lỗi này "Không thể tải tệp hoặc lắp ráp 'example' hoặc một trong các phụ thuộc của nó. Cố gắng tải chương trình có định dạng không chính xác" thường do cấu hình nhóm ứng dụng không chính xác.

  1. Đảm bảo rằng AppPool mà trang web của bạn hiện đang chạy có "Bật ứng dụng 32-bit" được đặt thành Sai.
  2. Đảm bảo bạn đang sử dụng đúng phiên bản cho nền tảng của mình.
  3. Nếu bạn gặp lỗi này trên một trang web, hãy đảm bảo rằng nhóm ứng dụng của bạn được đặt để chạy ở chế độ chính xác (các trang web 3.0 phải chạy ở chế độ 64 bit)
  4. Bạn cũng nên đảm bảo rằng tham chiếu đến assembly đó trong visual studio đang trỏ đến đúng tệp trong thư mục gói.
  5. Đảm bảo bạn đã cài đặt đúng phiên bản dll trong GAC cho các trang web 2.0.
  6. Điều này cũng có thể do WSODLibs được quảng bá cùng với dự án web.
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.