Memecahkan Masalah BadImageFormatException

107

Saya memiliki layanan Windows yang ditulis dalam C # menggunakan Visual Studio 2010 dan menargetkan penuh .NET Framework 4. Ketika saya menjalankan dari Debug membangun layanan berjalan seperti yang diharapkan. Namun, ketika saya menjalankannya dari Build rilis, saya mendapatkan System.BadImageFormatException (detailnya di bawah). Saya telah mencari solusi di internet tetapi sejauh ini setiap hal yang saya temukan tidak membantu saya menemukan solusi.

Masalahnya ada pada sistem Windows 7 64-bit (dev) dan Windows XP SP3 32-bit (target).

Inilah yang saya coba sejauh ini:

  • Semua setelan build terverifikasi seperti Target Platform sama (x86).
  • Menggunakan peverify dengan opsi / verbose untuk memastikan binari assembly valid.
  • Menggunakan fuslogvw untuk mencari masalah pemuatan apa pun.
  • CheckAsm digunakan untuk mencari file atau assembile yang hilang.

Semua pemeriksaan ini tidak mengubah apa pun. Saya telah menyertakan teks lengkap dari informasi pengecualian di bawah ini, dengan beberapa nama diubah untuk melindungi rahasia master perusahaan saya.

System.BadImageFormatException tidak ditangani
  Pesan = Tidak dapat memuat file atau assembly 'XxxDevices, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null' atau salah satu dependensinya. Upaya telah dilakukan untuk memuat program dengan format yang salah.
  Sumber = XxxDevicesService
  FileName = XxxDevices, Versi = 1.0.0.0, Budaya = netral, PublicKeyToken = null
  FusionLog = Manajer perakitan dimuat dari: C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ clr.dll
Berjalan di bawah executable c: \ Dev \ TeamE \ bin \ Release \ XxxDevicesService.vshost.exe
--- Log kesalahan terperinci mengikuti. 

=== Informasi status pra-pengikatan ===
LOG: Pengguna = XXX
LOG: DisplayName = XxxDevices, Versi = 1.0.0.0, Budaya = netral, PublicKeyToken = null
 (Sepenuhnya ditentukan)
LOG: Appbase = file: /// c: / Dev / TeamE / bin / Release /
LOG: Initial PrivatePath = NULL
Perakitan panggilan: XxxDevicesService, Versi = 1.0.0.0, Budaya = netral, PublicKeyToken = null.
===
LOG: Pengikatan ini dimulai dalam konteks pemuatan default.
LOG: Menggunakan file konfigurasi aplikasi: c: \ TeamE \ bin \ Release \ XxxDevicesService.vshost.exe.Config
LOG: Menggunakan file konfigurasi host: 
LOG: Menggunakan file konfigurasi mesin dari C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ config \ machine.config.
LOG: Kebijakan tidak sedang diterapkan ke referensi saat ini (ikatan perakitan pribadi, khusus, parsial, atau berbasis lokasi).
LOG: Mencoba mengunduh file URL baru: /// c: /TeamE/bin/Release/XxxDevices.DLL.
ERR: Gagal menyelesaikan pengaturan perakitan (jam = 0x8007000b). Probing dihentikan.

  StackTrace:
       di XxxDevicesService.Program.Main (String [] args)
       di System.AppDomain._nExecuteAssembly (perakitan RuntimeAssembly, String [] args)
       di Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly ()
       di System.Threading.ExecutionContext.Run (ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       di System.Threading.ExecutionContext.Run (ExecutionContext executionContext, ContextCallback callback, Object state)
       di System.Threading.ThreadHelper.ThreadStart ()
  InnerException: 

sumber
apakah Anda mencampur kode asli / .net sama sekali?
Keith Nicholas
1
Anda berada di jalur yang benar bahwa pengecualian ini dikaitkan dengan perbedaan bit x86 / x64. Saya menganggap ini bukan aplikasi web kan? Juga, jenis perakitan apa itu XxxDevicesService? Apakah dikompilasi untuk platform tertentu (misalnya 32 bit)? Jika demikian, maka Anda harus mengkompilasi platform Anda ke 32 bit.
Reddog

Jawaban:

121

Semua setelan build terverifikasi seperti Target Platform sama (x86).

Bukan itu yang dikatakan log kerusakan:

Manajer perakitan dimuat dari: C: \ Windows \ Microsoft.NET \ Framework64

Perhatikan 64 di namanya, itu adalah rumah dari kerangka versi 64-bit. Tetapkan pengaturan platform Target pada proyek EXE Anda , bukan proyek perpustakaan kelas Anda. Proyek EXE XxxDevicesService menentukan bitness dari proses tersebut.

Hans Passant
sumber
6
Dan saat Anda memeriksa proyek EXE- periksa Debug dan Rilis. : /
chris
44

Setelah saya berhenti membenturkan kepala saya ke meja memikirkan seluruh minggu yang saya habiskan untuk mengatasi masalah ini, saya membagikan apa yang berhasil untuk saya. Saya memiliki Win7 64 bit, 32-bit Oracle Client, dan proyek MVC 5 saya diatur untuk berjalan pada platform x86 karena bitness Oracle. Saya terus mendapatkan kesalahan yang sama:

Tidak dapat memuat file atau assembly 'Oracle.DataAccess' atau salah satu dependensinya. Upaya telah dilakukan untuk memuat program dengan format yang salah.

Saya memuat ulang paket NuGet, saya menggunakan salinan DLL yang berfungsi untuk orang lain di aplikasi yang berbeda, saya mengatur basis kode dalam perakitan dependen untuk menunjuk ke folder bin proyek saya, saya mencoba CopyLocal sebagai benar atau salah, saya mencoba semuanya. Akhirnya saya sudah cukup banyak melakukannya, saya ingin memeriksa kode saya, dan sebagai kontraktor baru, saya tidak menyiapkan subversi. Saat mencari cara untuk mengaitkannya ke VS, saya tersandung jawabannya. Apa yang saya temukan berhasil adalah menghapus centang pada opsi "Gunakan versi 64 bit IIS Express untuk Situs Web dan Proyek" di bawah Proyek dan Solusi => bagian Proyek Web di bawah Alat => menu Opsi.

Joey Morgan
sumber
3
Benar-benar penyelamat hidup !! Terima kasih. Bagi saya, saya harus benar-benar memeriksa ini, karena proyek saya secara efektif x64. Terima kasih lagi!!!
viper
Setelah semua bantuan yang saya terima di sini, saya sangat senang bisa membayar sebagian darinya!
Joseph Morgan
3
Bagi mereka yang menggunakan IIS Lokal, pastikan "Aktifkan Aplikasi 32-Bit" pool aplikasi Anda (di bawah Pengaturan Lanjutan) disetel ke True .
Eric Eskildsen
Sebuah Addenum ke @ komentar EricEskildsen di atas tentang "memungkinkan aplikasi 32-bit" di kolam aplikasi, bahkan jika Anda tidak ingin melakukan itu di lingkungan hidup, membalik saklar yang dapat memberikan petunjuk tambahan apakah Anda sedang menghadapi 32 -bit / 64-bit masalah atau yang lainnya.
CVn
Ledakan! Itu dia.
itslittlejohn
21

Apa yang saya temukan berhasil adalah memeriksa opsi "Gunakan versi 64 bit IIS Express untuk Situs Web dan Proyek" di bawah Proyek dan Solusi => bagian Proyek Web di bawah Alat => menu Opsi.

Lucy Zhang
sumber
kamu adalah penyelamat. +1
Amit Kumar
Saya menginstal ulang VS dan memecahkan masalah ini (terima kasih - solusi ini berhasil). Moral dari cerita bagi saya adalah jika saya tahu saya tidak mengubah kode apa pun untuk memulai, mungkin saya harus melihat konfigurasi VS terlebih dahulu.
taylorswiftfan
@Lucy kotak centang 'Gunakan versi 64 bit IIS Express untuk Situs Web dan Proyek' tidak aktif
k_kumar
Tolong beri tahu Lucy
k_kumar
12

Ini biasanya dapat terjadi saat Anda mengubah kerangka kerja target .csproj dan mengembalikannya ke awal.

Pastikan 1 jika supportRuntime version = "runtime berbeda dari target proyek cs" di bawah tag startup di app.config.

Pastikan 2 Itu juga berarti memeriksa file lain yang dibuat secara otomatis atau file lain di folder properti mungkin untuk melihat apakah tidak ada lagi ketidakcocokan waktu proses antara file ini dan file yang ditentukan dalam file .csproj.

Ini mungkin hanya menghemat banyak waktu sebelum Anda mulai mencoba berbagai hal dengan properti proyek untuk mengatasi kesalahan.

Purvin
sumber
Saya menemukan masalah serupa dan jawaban Anda adalah solusi untuk saya. App.config saya memiliki runtime yang didukung berbeda.
Krisztián Kis
9

Saya mengalami masalah yang sama meskipun saya memiliki Windows 7 64-bit dan saya memuat DLL 64-bit b / c di properti Proyek | Build Saya telah memeriksa "Lebih suka 32-bit". (Tidak tahu mengapa itu disetel secara default). Setelah saya hapus centangnya, semuanya berjalan dengan baik

SN
sumber
1
Sama disini. Ini berhasil. Merujuk rakitan 64-bit dan konfigurasi build aktif ditetapkan ke Semua CPU, tetapi karena pengaturan "lebih suka 32-bit" ini, diasumsikan 32-bit digunakan untuk menjalankan aplikasi dan menyebabkan masalah.
Bernoulli IT
Memilih sembarang CPU daripada x86 dalam mode Debug dan bekerja dengan sangat baik.
Cardi DeMonaco Jr
7

Anda juga bisa mendapatkan pengecualian ini ketika aplikasi Anda menargetkan .NET Framework 4.5 (misalnya) dan Anda memiliki app.config berikut:

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

Saat mencoba meluncurkan debug aplikasi, Anda akan mendapatkan BadImageFormatException.

Menghapus baris yang menyatakan versi v2.0 akan menghapus kesalahan.

Saya mengalami masalah ini baru-baru ini ketika saya mencoba mengubah platform target dari proyek .NET 2.0 lama menjadi .NET 4.5.

Cédric V
sumber
6

Latar Belakang

Kami mulai mendapatkan ini hari ini ketika kami mengalihkan layanan WCF kami dari AnyCPU ke x64 pada server Windows 2012 R2 yang menjalankan IIS 6.2.

Pertama kami memeriksa satu-satunya perakitan yang direferensikan 10 kali, untuk memastikan itu sebenarnya bukan x86 dll. Selanjutnya kami memeriksa kumpulan aplikasi berkali-kali untuk memastikan itu tidak mengaktifkan aplikasi 32 bit.

Saat iseng saya mencoba mengubah pengaturan. Ternyata pool aplikasi di IIS secara default menggunakan nilai Enable 32-Bit Applications dari False, tetapi IIS mengabaikannya di server kami karena alasan tertentu dan selalu menjalankan layanan kami dalam mode x86.

Larutan

  • Pilih kumpulan aplikasi.
  • Pilih Set Aplikasi Renang Default ... atau Advanced Settings ... .
  • Ubah Aktifkan Aplikasi 32-Bit ke True.
  • Klik OK .
  • Pilih Set Application Pool Defaults ... atau Advanced Settings ... lagi.
  • Ubah Aktifkan Aplikasi 32-Bit kembali ke False.
  • Klik OK .
JoelC
sumber
4

Saya memperbaiki masalah ini dengan mengubah aplikasi web untuk menggunakan "Kumpulan Aplikasi" yang berbeda.

Cocu_1012
sumber
4

Untuk siapa saja yang mungkin tiba di sini nanti .... Tidak ada yang berhasil untuk saya. Semua majelis saya baik-baik saja. Saya memiliki konfigurasi aplikasi di salah satu Proyek Visual Studio saya yang seharusnya tidak ada di sana. Jadi, pastikan file konfigurasi aplikasi Anda diperlukan.

Saya menghapus konfigurasi aplikasi tambahan dan berhasil.

McSick
sumber
Memperbaiki itu untuk saya. App.config saya mengatur aplikasi .NET 4.5.1 saya ke 2.0 CLR!
Jared Thirsk
4

Target build x64 Target Server Hosting IIS 64 Bit

Jika build aplikasi menargetkan OS 64-Bit, maka di server 64-Bit yang menghosting IIS, Setel aplikasi aktifkan 32 bit di pool aplikasi yang menjalankan situs web / aplikasi web ke false.

masukkan deskripsi gambar di sini

VK_217
sumber
2

Tentukan pool aplikasi yang digunakan oleh aplikasi dan setel properti dengan menyetel Aktifkan aplikasi 32 bit ke True. Ini dapat dilakukan melalui pengaturan awal dari kumpulan aplikasi.

Anand
sumber
2

Saat membuat aplikasi untuk platform 32-bit atau 64-bit (Pengalaman saya dengan Visual Studio 2010), jangan mengandalkan Pengelola Konfigurasi untuk mengatur platform yang benar untuk eksekusi. Meskipun CM telah memilih x86 untuk aplikasi, periksa properti proyek (tab Build): mungkin masih ada tulisan "Semua CPU" di sana. Dan jika Anda menjalankan "Semua CPU" yang dapat dieksekusi pada platform 64-bit, itu akan berjalan dalam mode 64-bit dan menolak untuk memuat DLL yang menyertai yang dibuat untuk platform x86.

Jeremy Tinkler
sumber
1

Hapus ketergantungan Anda pada System.Runtime di Web.Config Anda, itu berhasil untuk saya:

<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>
Niclas
sumber
Bagi saya itu System.Net.Http. Terimakasih untuk ini.
Snickbrack
1

Untuk .NET Core , ada bug Visual Studio 2017 yang dapat menyebabkan halaman Build properti proyek menampilkan target platform yang salah. Setelah Anda menemukan bahwa masalahnya adalah, penyelesaiannya cukup mudah. Anda dapat mengubah target ke nilai lain dan kemudian mengubahnya kembali.

Atau, Anda dapat menambahkan pengenal runtime ke file .csproj. Jika Anda memerlukan .exe untuk dijalankan sebagai x86 agar dapat memuat DLL asli x86, tambahkan elemen ini dalam PropertyGroup:

<RuntimeIdentifier>win-x86</RuntimeIdentifier>

Tempat yang bagus untuk meletakkan ini tepat setelah TargetFrameworkatau TargetFrameworkselemen.

Edward Brey
sumber
1

Saya terkejut bahwa tidak ada orang lain yang menyebutkan ini jadi saya berbagi jika tidak ada bantuan di atas (kasus saya).

Apa yang terjadi adalah bahwa instance VBCSCompiler.exe entah bagaimana macet dan sebenarnya tidak melepaskan pegangan file untuk memungkinkan instance baru menulis file baru dengan benar dan menyebabkan masalah. Ini menjadi jelas ketika saya mencoba untuk menghapus folder "bin" dan mengeluh bahwa proses lain menggunakan file di sana.

Ditutup VS, membuka task manager, melihat dan menghentikan semua instance VBCSCompiler dan menghapus folder "bin" untuk kembali ke tempat saya sebelumnya.

Referensi: https://developercommunity.visualstudio.com/content/problem/117596/vbcscompilerexe-process-stays-runing-after-exiting.html

George
sumber
Solusi saya juga menghapus semua direktori bin dan debug.
gabnaim
0

Untuk siapa saja yang mungkin tiba di sini nanti ...
Untuk solusi Desktop saya mendapat BadImageFormatExceptionpengecualian.
Semua opsi build proyek baik-baik saja (semua x86). Tetapi proyek StartUp solusi diubah ke beberapa proyek lain (proyek perpustakaan kelas).

Mengubah proyek StartUp ke aslinya (proyek aplikasi .exe) adalah solusi dalam kasus saya

Fabio
sumber
0

Ketika saya menghadapi masalah ini, hal berikut menyelesaikannya untuk saya:

Saya memanggil dll OpenCV dari dalam exe lain, dll saya tidak berisi dll opencv yang sudah dibutuhkan seperti highgui, features2d, dan lain-lain yang tersedia di folder file exe saya. Saya menyalin semua ini ke direktori proyek exe saya dan tiba-tiba berhasil.

Ali Nejad
sumber
0

Kesalahan ini "Tidak dapat memuat file atau perakitan 'contoh' atau salah satu ketergantungannya. Upaya telah dilakukan untuk memuat program dengan format yang salah" biasanya disebabkan oleh konfigurasi kumpulan aplikasi yang salah.

  1. Pastikan AppPool situs Anda saat ini berjalan memiliki "Aktifkan Aplikasi 32-Bit" disetel ke False.
  2. Pastikan Anda menggunakan versi yang benar untuk platform Anda.
  3. Jika Anda mendapatkan kesalahan ini di situs web, pastikan bahwa kumpulan aplikasi Anda diatur untuk berjalan dalam mode yang benar (situs 3.0 harus berjalan dalam mode 64 bit)
  4. Anda juga harus memastikan bahwa referensi ke assembly tersebut di studio visual mengarah ke file yang benar di folder paket.
  5. Pastikan Anda memiliki versi yang benar dari dll yang diinstal di situs GAC untuk 2.0.
  6. Ini juga dapat disebabkan oleh WSODLib yang dipromosikan dengan proyek web.
Ben Petersen
sumber