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:
XxxDevicesService
? Apakah dikompilasi untuk platform tertentu (misalnya 32 bit)? Jika demikian, maka Anda harus mengkompilasi platform Anda ke 32 bit.Jawaban:
Bukan itu yang dikatakan log kerusakan:
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.
sumber
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:
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.
sumber
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.
sumber
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.
sumber
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
sumber
Anda juga bisa mendapatkan pengecualian ini ketika aplikasi Anda menargetkan .NET Framework 4.5 (misalnya) dan Anda memiliki app.config berikut:
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.
sumber
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
sumber
Saya memperbaiki masalah ini dengan mengubah aplikasi web untuk menggunakan "Kumpulan Aplikasi" yang berbeda.
sumber
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.
sumber
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.
sumber
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.
sumber
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.
sumber
Hapus ketergantungan Anda pada System.Runtime di Web.Config Anda, itu berhasil untuk saya:
sumber
System.Net.Http
. Terimakasih untuk ini.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
:Tempat yang bagus untuk meletakkan ini tepat setelah
TargetFramework
atauTargetFrameworks
elemen.sumber
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
sumber
Untuk siapa saja yang mungkin tiba di sini nanti ...
Untuk solusi Desktop saya mendapat
BadImageFormatException
pengecualian.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
sumber
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.
sumber
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.
sumber