Tidak dapat memuat file atau perakitan ... Upaya telah dilakukan untuk memuat program dengan format yang salah (System.BadImageFormatException)

409

Saya punya dua proyek, ProjectAdan ProjectB. ProjectBadalah aplikasi konsol, yang tergantung pada ProjectA. Kemarin, semuanya bekerja dengan baik, tetapi tiba-tiba hari ini ketika saya menjalankan ProjectBsaya mendapatkan ini:

BadImageFormatException tidak ditangani :
Tidak dapat memuat file atau perakitan 'ProjectA, Versi = 1.0.0.0, Budaya = netral, PublicKeyToken = null' atau salah satu dari ketergantungannya. Upaya telah dilakukan untuk memuat program dengan format yang salah.

Keduanya hanyalah proyek biasa, tanpa ketergantungan pada proyek non-Net lainnya. Keduanya sepenuhnya .Net - tidak ada kode asli, dan tidak ada P / Invoke. Saya punya proyek lain yang tergantung ProjectAdan masih berfungsi dengan baik.

Hal yang saya coba:

  • Pastikan kedua proyek diatur ke "Apa saja CPU," dengan centang kotak centang pembangunan . Mereka.
  • Pastikan kedua proyek memiliki Kerangka Target yang sama (Profil Klien .Net 4.0) .
  • Di bawah ProjectB -> Referensi -> ProjectA -> Properti, pastikan "Salin Lokal" disetel ke "Benar" _ (saya memverifikasi bahwa ProjectA.dll sedang disalin dengan benar)
  • Bersihkan / Bangun kembali solusi. Saya bahkan mencoba menghapus secara manual folder / bin dan / obj di kedua proyek.
  • Mulai ulang Visual Studio. Nyalakan kembali komputer saya.
  • Lihat salinan repositori yang sama sekali baru.

Tapi saya masih mendapatkan kesalahan yang sama. Saya tidak tahu apa yang saya lakukan untuk menyebabkan ini, atau bagaimana cara memperbaikinya. Ada ide?

BlueRaja - Danny Pflughoeft
sumber
1
Jika Anda memiliki riwayat versi di repositori, dapatkah Anda memeriksa apakah ada beberapa perbedaan dalam file csproj?
Steve
@Steve: Menurut Mercurial, tidak ada perubahan selain menambahkan referensi ke file .cs baru
BlueRaja - Danny Pflughoeft
Apakah Anda mendapatkan perilaku yang sama di komputer lain? Apakah ada hal lain yang berubah pada mesin (mis. Pembaruan Windows, pembaruan ketergantungan, dll.)?
Mike Parkhill
Sudahkah Anda mencoba mengembalikan file .cs baru itu?
Mike Parkhill
2
Ini berhasil untuk saya ............ stackoverflow.com/a/9419522/191403
Som

Jawaban:

647

Saya cukup yakin Anda mengalami konflik 32-bit / 64-bit. Kedengarannya seperti proyek utama Anda mungkin diatur ke 32-bit sementara kelas referensi-nya diatur ke 64-bit. Coba lihat pertanyaan SO ini dan ini juga . Di antara keduanya, Anda harus bisa memecahkan masalah Anda.

Icemanind
sumber
71
Lakukan Saya entah bagaimana benar-benar kehilangan dropdown "target platform" di project-->properties-->build- itu ditetapkan untuk x86; mengaturnya ke "Any CPU" memperbaiki masalah ini. Saya selalu berpikir bahwa pengaturan ini sama dengan dropdown "target platform" di manajer konfigurasi, tetapi ternyata tidak (pada kenyataannya, "target platform" di manajer konfigurasi tampaknya tidak melakukan apa-apa!)
BlueRaja - Danny Pflughoeft
10
Juga verifikasi bahwa proyek ini bukan CPU dengan Prefer 32 bit dicentang. Project -> properties -> build
Reid Evans
26
PS: Alasan lain adalah "Aktifkan aplikasi 32-bit" menjadi "salah" dalam pengaturan kumpulan aplikasi. Anda perlu me-restart IIS setelah mengaturnya ke true.
dvdmn
3
Yang terburuk yang terjadi pada saya dengan kesalahan ini adalah ketika VS memutuskan untuk menambahkan <PlatformTarget>x86</PlatformTarget>di salah satu proyek dependen tanpa alasan sama sekali. Jika saya belum melihat SVN saya tidak akan pernah tahu mengapa aplikasi MVC kami gagal diluncurkan.
jahu
1
Silakan atur di IIS DefaultAppPool-> Aktifkan Aplikasi 32-Bit = Benar
Shantu
196

Mungkin Anda menghadapi masalah dengan situs web Anda setelah penggelaran di server.

Maka Anda perlu menyesuaikan kumpulan aplikasi Anda ke Aktifkan Aplikasi 32-Bit .

Langkah

  1. Buka IIS Manager
  2. Klik pada Pools Aplikasi
  3. Pilih kumpulan aplikasi apa pun yang Anda gunakan
  4. Dari panel kanan, klik Pengaturan Lanjut ...

  5. Setel Aktifkan Aplikasi 32-Bit ke True

    Pengaturan lanjutan Aktifkan 32-Bit

Ali Adravi
sumber
1
Apakah saya melewatkan sesuatu? OP berbicara tentang aplikasi konsol bukan penyebaran IIS: "ProjectB adalah aplikasi konsol, yang tergantung pada ProjectA"
MickyD
129

Saya baru saja pesan kesalahan ini menjalankan IIS Express di Visual Studio 2015. Dalam kasus saya, saya perlu menjalankan versi 64 bit dari IIS Express:

Alat → Pilihan → Proyek dan Solusi → Proyek Web
Centang kotak yang mengatakan "Gunakan versi 64 bit dari IIS Express untuk situs web dan proyek".

Tangkapan layar:

Cuplikan layar opsi VS untuk Proyek Web.

TTT
sumber
2
Sebaliknya berlaku untuk, saya telah mencentang 'Gunakan 64 bit' dan perlu membukanya ...
cjb110
32

Saya punya masalah yang sama. Saya telah menetapkan "Target Platform" Project A ("Project A" (Klik Kanan) -> Properties-> Build -> "Target Platform") ke x86 tetapi tetap mempertahankan Project B di "Any CPU". Mengatur Proyek B ke "x86" memperbaikinya.


sumber
15

Saya punya masalah ini menjalankan unit test (xunit) di Visual Studio 2015 dan menemukan perbaikan berikut:

Menu Bar -> Test -> Test Settings -> Default Processor Architecture -> X64
mkaj
sumber
7

Anda mungkin perlu mengubah pengaturan Appication Pool "Aktifkan Aplikasi 32bit" menjadi BENAR di IIS7 jika Anda memiliki setidaknya 1 32bit dll \ exe di proyek Anda.

fergal303
sumber
OP berbicara tentang aplikasi konsol bukan IIS
MickyD
5

Pertama-tama saya mendapatkan ini di VS2017 dengan proyek lama yang saya butuhkan untuk membuat perubahan kecil dan meningkatkan semua proyek ke kerangka kerja 4.7.


Beberapa orang lain telah menyebutkan pemilihan Any CPUdapat memperbaiki masalah ini.

Ada beberapa tempat yang perlu Anda lakukan, dan itu mungkin tidak sesederhana memilih dari dropdown. Ini memperbaikinya untuk saya:

1) Anda harus melakukannya di sini:

masukkan deskripsi gambar di sini

2) Dan juga di Configuration Manager(klik kanan pada solusi)

masukkan deskripsi gambar di sini

Tetapi bagaimana jika itu tidak ada di sana ???

Kemudian klik Newdan pilih pengaturan ini: ( terima kasih @RckLN )

masukkan deskripsi gambar di sini

Simon_Weaver
sumber
2

Saya memiliki masalah yang sama dengan beberapa proyek dalam solusi yang sama, saya akhirnya menetapkan semua kerangka kerja target untuk .NET Framework 4 dan x86 untuk CPU target dan akhirnya berhasil dikompilasi.

Teknisi Banjir
sumber
1
Bekerja di Rilis tetapi gagal di Debug. Setel semua ke .Net Framework 4 (BUKAN Perbarui 1) dan Debug berjalan sekarang.
DCastenholz
2

Anda mungkin juga melihat masalah ini jika Anda mencoba untuk mengemas proyek 64bit dengan installer MSI di VS. ("Alasannya adalah karena shim asli yang dikemas dengan file .msi adalah eksekusi 32-bit.")

Lihat di sini untuk perincian lebih lanjut: http://blogs.msdn.com/b/heaths/archive/2006/02/01/64-bit-managed-custom-actions-with-visual-studio.aspx

G88
sumber
1
Pertimbangkan untuk meringkas artikel yang ditautkan untuk kepentingan pembaca di masa mendatang; kalau-kalau tautannya mati.
Obligasi - Java Bond
2

Tak satu pun dari solusi ini bekerja untuk saya - tetapi dengan menghapus isi folder bin dan obj semuanya menjadi keren kembali.

berlayar
sumber
2

Saya mendapatkan ini ketika membangun proyek melalui Visual Studio Online (VSTS) Build menggunakan Visual Studio Build Langkah.

Solusinya adalah:

  • Hapus folder sumber yang ada
  • Secara eksplisit set 'Any CPU' di platform untuk semua Visual Studio Builds termasuk dependensi (lihat screenshot di bawah).
  • Jalankan kembali build

Tangkapan Layar VSO

Hoki
sumber
2

Berikut ini yang memecahkan masalah bagi saya, hapus centang 'Lebih suka 32-bit': masukkan deskripsi gambar di sini

Bumerang
sumber
1

Saya mengalami masalah yang sama. Itu muncul tiba-tiba dan itu tampak aneh bagiku.

Dalam cuplikan Exception, untuk FusionLog, saya melihat berikut ini di dalam pesannya:

... C: \ Windows \ Microsoft.NET \ Framework64 ...

Lebih lanjut tentang log fusi: http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.110).aspx

Semua proyek memiliki CPU Target AnyCPU. Saya mengubah proyek aplikasi (proyek yang merujuk semua proyek lain) ke CPU Target x86. Sekarang berhasil.

Tidak yakin bagaimana pencampuran CPU Target terjadi tanpa alasan yang jelas, tetapi itu terjadi.

Jeremy Ray Brown
sumber
1

Saya juga menghadapi masalah ini dalam sebuah proyek, setelah beberapa menit saya menemukan solusinya, masalah ini disebabkan oleh konfigurasi CPU, Jika Anda menggunakan Visual Studio 2010 atau VS 2013 , cukup goto properti proyek dan kemudian pilih Kompilasi dari bilah samping dan akan ada 5 drop-down, Drop-down ke-5 akan menjadi CPU Target:, Anda harus mengaturnya ke x86 atau x64 sesuai dengan kebutuhan Anda alih-alih CPU Apa Pun.

Masalah saya terpecahkan setelah mengubahnya ke x86.

Jawad Nadeem
sumber
1

Ini juga dapat terjadi hanya dengan memiliki beberapa kerangka kerja yang didukung yang didefinisikan dalam file app.config dan, memaksa aplikasi untuk berjalan dalam kerangka .NET yang berbeda selain yang disebutkan pertama kali dalam file app.config .

Dan ini juga akan menyala ketika Anda memiliki kedua kerangka kerja yang disebutkan tersedia di sistem Anda.

Sebagai solusinya, buka kerangka target yang akan Anda gunakan untuk debugging di app.config

mis: jika Anda mencoba menjalankan di .NET 4, file konfigurasi harus memiliki sesuatu yang mirip dengan ini,

<supportedRuntime version="v4.0"/>
<supportedRuntime version="v2.0.50727"/>
kuma DK
sumber
1

Dalam proyek saya untuk C #, properti proyek -> [Build] -> Target platform: CPU apa pun, dan hapus centang Prefer 32-bit untuk membiarkan kompiler memilih secara otomatis.

bruce
sumber
1

Perakitan Chilkat .NET 4.5 mengharuskan runtime VC ++ 2012 atau 2013 diinstal di komputer mana pun yang menjalankan aplikasi Anda. Sebagian besar komputer sudah menginstalnya. Komputer pengembangan Anda akan memilikinya karena Visual Studio telah diinstal. Namun, jika menggunakan ke komputer di mana runtime VC ++ yang diperlukan tidak tersedia, kesalahan di atas akan terjadi:

Instal semua paket di bawah ini

Paket Visual C ++ Redistributable untuk Visual Studio 2013 - vcredist_x64

Paket Visual C ++ Redistributable untuk Visual Studio 2013 - vcredist_x86

Paket Visual C ++ Redistributable untuk Visual Studio 2012 - vcredist_x64

Paket Visual C ++ Redistributable untuk Visual Studio 2012 - vcredist_x86

Sukesh Chand
sumber
1

Jika Anda menggunakan LibreOffice dari program Anda melalui integrasi cli .net seperti saya, saya mendapat kesalahan yang sama. Saya menggunakan versi LibreOffice yang lebih lama pada lingkungan produksi di PC saya. Saya menginstal versi yang lebih baru yang mengalami konflik. Hapus instalan LibreOffice. Saya menemukan solusinya di sini . NET CLI: Tidak dapat memuat file atau perakitan 'cli_cppuhelper'

Jan Sršeň
sumber
0

Ini mungkin sedikit lucu, tetapi saya memiliki masalah yang sama dengan kode kerja normal. Saya menambahkan StreamWriter dan StreamReader dan itu memberikan kesalahan itu. Solusinya adalah saya mengambil kode itu ke dalam tanda kurung komentar kemudian melakukan debug dan mulai bekerja lagi

Hovhannes Babayan
sumber
0

Dalam kasus saya ketergantungan tidak ada di dll yang melempar pengecualian ini. Saya memeriksa dengan Dependency Walker, menambahkan dll yang hilang dan masalahnya teratasi.

Lebih khusus, saya entah bagaimana merusak opencv_core340.dll saya dengan secara tidak sengaja menambahkan kata kunci SVN ke dalamnya, dan dengan demikian dll saya tidak bisa lagi menggunakannya. Namun saya tidak percaya bahwa solusi untuk masalah ini tergantung pada apakah dll rusak atau hilang. Saya hanya menambahkan ini demi memberikan informasi lengkap.

Alex
sumber
0

Menembak! Saya tahu tentang masalah ini. Saya pikir saya melakukan semuanya dengan benar sampai saya tidak sengaja melihat 'x86' di jendela output VS dan saat itulah saya memahami penyebabnya. Terbuang beberapa menit untuk hari ini.

Konfigurasi di bawah jendela 'Terbitkan' diatur ke 'x86'; sedangkan, di tempat lain, itu 'x64'.

Pastikan itu tidak sinkron di seluruh manajer konfigurasi, publikasikan pengaturan, konfigurasi solusi, dan pengaturan IIS (jika itu server web Anda).

Juga, harap diingat - VS adalah aplikasi 32-bit dan IIS 64 bit. Aplikasi 32-bit dinonaktifkan secara default di IIS.

masukkan deskripsi gambar di sini

Mandeep Janjua
sumber
0

Saya telah mendeteksi sesuatu yang berbeda dari jawaban lainnya. Mencapai pengecualian ini dalam proyek saya adalah hasil kompilasi yang korup. Tanpa membuat perubahan, hanya memaksa membangun kembali , itu diperbaiki.

Acubo
sumber
0

Saya memiliki masalah yang sama. Proyek B dalam kasus saya adalah .Net Core Class Library yang memiliki Nuget "Microsoft.Management.Infrastructure" diinstal. Kesalahannya adalah saya menyebut proyek saya B "MI". Saya mengubah nama proyek menjadi sesuatu yang lain dan tiba-tiba semuanya bekerja lagi.

lufist
sumber
-1

Mesin saya menunjukkan kepada saya pembaruan BIOS dan saya bertanya-tanya apakah itu ada hubungannya dengan tiba-tiba kesalahan ini muncul. Dan setelah saya melakukan pembaruan, kesalahan teratasi dan solusi dibangun dengan baik.

radkan
sumber
-1

Apakah Anda mencoba menjalankan file .exe dari cmd? Ini kesalahan saya. Jalankan saja file .exe dengan mengklik dua kali. Jika .NET Core SCD untuk Windows 8.1 / Windows Server 2012 R2 x64.

Tadej
sumber