“Upaya telah dilakukan untuk memuat program dengan format yang salah” bahkan ketika platformnya sama

461

Saya memanggil fungsi dari DLL 32-bit yang tidak dikelola pada sistem 64-bit. Apa yang saya dapatkan adalah:

BadImageFormatException: Upaya telah dilakukan untuk memuat program dengan format yang salah. (Pengecualian dari HRESULT: 0x8007000B)

Pada awalnya, saya mengatur proyek saya ke platform Any CPU, jadi saya mengubah keduanya menjadi x86, tetapi kesalahan ini masih terjadi. Itu benar-benar satu-satunya perbaikan yang saya tahu untuk ini.

DLL tidak rusak atau apa pun, karena saya dapat menggunakannya dengan program lain (yang saya tidak punya sumbernya). Saya pikir mungkin itu tidak menemukan ketergantungan, tetapi saya memeriksa dan mereka semua ada di sana. Plus, bukankah itu melempar DllNotFoundExceptiondalam kasus itu?

Apa lagi yang bisa saya lakukan? Dan sebelum Anda mengatakan "Gunakan DLL 64-bit yang tidak dikelola sebagai gantinya," izinkan saya menunjukkan bahwa tidak ada satu pun. ;)

David Brown
sumber
1
Proyek apa yang Anda ubah menjadi x86? Dan bagaimana Anda menjalankannya ketika Anda mendapatkan pengecualian, melalui debugger atau secara manual? Jika yang terakhir, apakah Anda memperhatikan bahwa ketika Anda berubah ke x86, Anda mendapat folder baru di direktori bin \ Anda? Ini pada dasarnya sekarang bin \ x86 \ Debug untuk file.
Lasse V. Karlsen
Bisakah Anda memverifikasi bahwa executable sedang berjalan dalam mode 32-bit (* 32 di process manager)?
JP Alioto
@Lasse V. Karlsen: Ya, saya menghapus bit x86 dari jalur keluaran ketika saya mengubah platform di setiap proyek. Proyek pertama saya adalah DLL yang membungkus fungsi dalam DLL yang tidak dikelola. Proyek kedua adalah executable yang menggunakan pembungkus di DLL pertama. Keduanya diatur ke x86.
David Brown
@ JP: Sebenarnya, manajer proses tidak menunjukkan itu berjalan sebagai proses 32-bit. Mengapa demikian?
David Brown

Jawaban:

532

Jika Anda mencoba menjalankan aplikasi 32-bit pada IIS 7 (dan / atau mesin OS 64-bit), Anda akan mendapatkan kesalahan yang sama. Jadi, dari IIS 7, klik kanan pada kumpulan aplikasi aplikasi dan pergi ke "pengaturan lanjutan" dan ubah "Aktifkan Aplikasi 32-Bit" menjadi "BENAR".

Mulai ulang situs web Anda dan itu akan berfungsi.

masukkan deskripsi gambar di sini

bluwater2001
sumber
1
Oh, hari-hari saya, saya telah mencari-cari menginstal komponen IIS tambahan ketika ini jawabannya ... Adakah yang bisa menyarankan downside untuk memilih opsi ini?
notidaho
3
Inilah diskusi yang bagus tentang masalah kinerja terkait hal ini: stackoverflow.com/questions/507820/…
Ben Power
Saya punya masalah dengan SharpSvn dan ini tidak membantu. :( Sth sangat salah dengan majelis ini yang saya katakan ...
user2173353
4
Jawaban ini bagi saya, karena pertanyaannya sama sekali tidak menyebutkan IIS!
kristianp
129

Entah bagaimana, kotak centang Bangun di Pengelola Konfigurasi telah dicentang untuk dieksekusi saya, jadi itu masih berjalan dengan membangun Apa saja CPU lama. Setelah saya memperbaikinya, Visual Studio mengeluh bahwa itu tidak bisa men-debug perakitan, tapi itu diperbaiki dengan restart.

David Brown
sumber
Terima kasih banyak. Ini juga membuat saya. Checked build in Configuration Manager dan sekarang berfungsi (aplikasi desktop WPF).
danglund
1
Jika Anda telah melakukan semua hal di atas, dan memeriksa pengaturan platform Anda, membangun pengaturan konfigurasi, membersihkan solusi dan itu masih tidak berfungsi - cari semua instance DLL dan hapus mereka.
Will Calderwood
dengan VS 2015 ini masih berlaku - meskipun saya tidak perlu memulai kembali :)
believedibelly
Itu dia! Mengunjungi kembali pengaturan Configuration Manager Anda adalah jawabannya.
AndyUK
74

Di Visual Studio , Klik kanan proyek Anda -> Pada panel kiri klik tab Bangun ,

Properti proyek, tab bangunan

di bawah Target Platform, pilih x86 (atau lebih umum arsitektur yang cocok dengan perpustakaan yang Anda tautkan)

Properti proyek, target platform

Saya harap ini membantu seseorang! :)

Marvin Thobejane
sumber
2
Ini memperbaiki masalah saya di VS2013, saya menemukan perbaikan alternatif adalah meninggalkan "Target platform" sebagai "Any CPU" tetapi centang kotak "Lebih suka 32-bit".
user1069816
2
Meskipun Anda harus menggunakan .NET 4.5 atau lebih tinggi untuk dapat mencentang kotak "Lebih suka 32-bit"
user1069816
1
Ya, tapi saya mengubah proyek saya di 'Any CPU' ke 'x64'. Proyek 32 bit saya berfungsi dengan baik tetapi kode yang sama saya ubah menjadi 64 bit, proyek itu tidak berfungsi dengan baik seperti 32 bit. Bisakah Anda memberi saya proses konversi 64 bit yang tepat ...
Ismayil S
@IsmayilS pastikan Anda menggunakan versi 64-bit perpustakaan yang Anda tautkan
Marvin Thobejane
53

Saya hanya punya masalah ini juga. Sudah mencoba semua saran di sini, tetapi itu tidak membantu.

Saya menemukan hal lain untuk memeriksa yang memperbaikinya untuk saya. Di Visual Studio, klik kanan pada proyek dan buka "Properties". Klik pada tab "Kompilasi" (atau "Bangun") dan kemudian klik "Opsi Kompilasi Lanjutan" di bagian bawah.

Periksa dropdown "Target CPU". Itu harus cocok dengan "Platform" yang Anda bangun. Yaitu, jika Anda membangun "Any CPU" maka "Target CPU" harus mengatakan "Any CPU". Telusuri semua Platform Anda dengan membuatnya aktif dan periksa pengaturan ini.

Denis
sumber
2
Dan bagi kita yang hanya menggunakan kompiler, perbaikan saya adalah menambahkan "/ platform: x86" ke flag kompiler.
Urchin
Ini memperbaikinya bagi saya juga. Saya harus menyesuaikan "target platform" pada tab "Build".
Jowen
jika Anda menggunakan 64 bit, periksa juga tanda "prefer 32 bit". Saya harus menonaktifkannya untuk saya.
N4ppeL
51

Jika Anda menemukan kesalahan ini ketika Anda mengklik tombol panah hijau untuk menjalankan aplikasi, tetapi masih ingin menjalankan aplikasi dalam 64 bit. Anda dapat melakukan ini di VS 2013, 2015, 2017, dan 2019

Pergi ke: Alat> Opsi> Proyek dan Solusi> Proyek Web> Gunakan IIS Express versi 64 bit

paibamboo
sumber
3
Terima kasih. Saya mencoba begitu banyak dan tidak ada yang membantu. Anda adalah penyelamat hidup saya. Saya memiliki OS 64bit, menginstal Visual Studio 64 bit [yang masih berjalan sebagai 32bit karena alasan yang tidak diketahui]. Ketika saya meletakkan Target Platform saya ke x64, itu melempar kesalahan BadImageFormatException. Dengan perbaikan Anda, itu berhasil. Saya memberi Anda upvote. You rock
SKCS Kamal
Saya senang saya bisa membantu :)
paibamboo
Ini jawaban yang saya butuhkan. Terima kasih banyak!
yushulx
Terima kasih banyak, ini menyelesaikan masalah. Ini bekerja dengan baik dengan proses Visual Studio 2017 32-bit.
samir105
1
masih bekerja dengan VS 2019, terima kasih
Jake Gaston
36

Jika Anda menggunakan Any CPU , Anda mungkin mengalami masalah ini jika opsi Prefer 32-bit dicentang:

Pastikan Anda tidak mencentang opsi ini di tab Bangun properti proyek !

masukkan deskripsi gambar di sini

Drew Noakes
sumber
3
Akan sangat membantu jika Anda dapat menunjukkan di mana di Visual Studio untuk menemukan opsi ini.
trysis
@trysis, opsi ini ada di halaman Build dari panel pengaturan proyek.
Drew Noakes
1
Saya mengatakan akan sangat membantu untuk memasukkannya. Seperti jawaban ini ada, tidak ada konteks untuk memberi tahu, pengguna StackOverflow yang baru dan sial, di mana menemukannya.
trysis
Apa jalan untuk mendapatkan formulir ini? Saya tidak dapat menemukannya
Adolfo Correa
Di Visual Studio, klik kanan proyek dan pilih 'Properti'.
Drew Noakes
8

Topik yang agak aneh untuk posting ini, tetapi mencari pesan kesalahan ini membawa saya ke sini.

Jika Anda membangun melalui sistem tim dan mendapatkan kesalahan ini, tab proses definisi pembangunan memiliki pengaturan "Platform MSBuild". Jika ini diatur ke "Otomatis", Anda mungkin mengalami masalah ini. Mengubahnya menjadi "X86" juga dapat mengatasi kesalahan.

Pelit
sumber
ini adalah jawaban terdekat dengan apa yang saya alami. Saya punya dll yang harus x86. Saya menggunakannya di proyek lain, yang secara default adalah AnyCPU. Mereka hanya perlu mencocokkan. Dalam hal ini, itu tidak membuat banyak perbedaan, jadi saya mengubah proyek baru ke x86.
greg
8

Dalam kasus saya, saya menggunakan DLL asli di C #. DLL ini bergantung pada beberapa DLL lain yang hilang. Setelah DLL lainnya ditambahkan semuanya bekerja.

Tomasz Stypich
sumber
4

Membangun jawaban dari @paibamboo

Dia berkata: Pergi ke: Alat> Opsi> Proyek dan Solusi> Proyek Web> Gunakan versi 64 bit dari IIS Express

Rekan kerja saya memeriksa kotak ini (dia secara eksplisit mencarinya), tetapi ada pesan kesalahan yang dipermasalahkan. Setelah beberapa jam dia menghapus centang kotak dan memeriksanya lagi. Lihat dan lihat: Kode sekarang berjalan dengan sukses.

Tampaknya, ada dua tempat di mana keadaan kotak ini disimpan yang menjadi tidak sinkron. Batalkan dan periksa kembali sinkronisasi.

Pertanyaan untuk pengguna yang lebih berpengetahuan: Apakah ada pembaruan atau sesuatu minggu lalu (untuk VS 2015) yang tidak disinkronkan negara?

MilConDoin
sumber
3

Lihat juga jawaban ini , yang memecahkan masalah yang sama bagi saya.

Diposting oleh Luis Mack pada 5/12/2010 pada 8:50 AM Saya menemukan masalah yang sama, hanya untuk proyek tertentu ketika dikompilasi pada mesin 64-bit. Perbaikan yang TAMPAKNYA berfungsi adalah mengubah satu karakter secara manual dalam aliran gambar SETIAP SAAT kontrol atau formulir pengguna diedit pada perancang

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w

Mengubah

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w

Yaitu 00LjAuMC4w kembali ke 0yLjAuMC4w di akhir baris (00 kembali ke 0y)

Shaul Behr
sumber
1
Ringkasan singkat tautan ini akan membantu @Shaul :)
Marvin Thobejane
Indah. Terima kasih, briefing menambahkan konten ke komentar Anda
Marvin Thobejane
2

Dalam kasus saya, saya menggunakan .exe kecil yang memuat ulang DLL yang direferensikan melalui Refleksi. Jadi saya hanya melakukan langkah-langkah ini yang menyelamatkan hari saya:

Dari properti proyek pada explorer solusi, pada tab build, saya memilih platfrom target x86

asdf_enel_hak
sumber
2

Dalam kasus saya, saya menjalankan tes melalui MSTest dan menemukan bahwa saya menggunakan DLL 32-bit dan 64-bit ke direktori tes. Program ini mendukung DLL 64-bit dan menyebabkannya gagal.

TL; DR Pastikan Anda hanya menggunakan DLL 32-bit untuk pengujian.

Mike Cluck
sumber
2

Kami memiliki masalah serupa dan kami berhasil memperbaikinya dengan menetapkan target Platform ke x86. Properti Proyek-> build

Joe
sumber
Jadi x86 dll berbeda dari x64? Apakah ada cara untuk mendeteksi ini pada file dll yang direferensikan?
NoBugs
@NoBugs Sepertinya Anda bisa. Lihatlah thread
Joe
1

Saya mengatasi masalah ini dengan cara 'Windows'. Setelah memeriksa semua pengaturan saya, membersihkan solusi dan membangunnya kembali, saya hanya menutup solusi dan membukanya kembali. Kemudian itu berhasil, jadi VS mungkin tidak menyingkirkan beberapa barang selama pembersihan. Ketika solusi logis tidak berhasil, saya biasanya beralih ke solusi yang tidak logis (atau tampaknya tidak logis). Windows tidak mengecewakan saya. :)

pengguna1771386
sumber
1

Saya dapat memperbaiki masalah ini dengan mencocokkan versi build saya dengan versi .NET di server.

Saya mengklik dua kali .exe hanya untuk melihat apa yang akan terjadi dan itu memberitahu saya untuk menginstal 4.5 ....

Jadi saya turun ke 4.0 dan berhasil!

Jadi pastikan versi Anda cocok. Itu berjalan di kotak dev saya baik-baik saja, tetapi server memiliki versi .NET yang lebih tua.

Nateous
sumber
1

Dalam kasus saya itu adalah konten file yang salah. DLL diunduh dari web, tetapi konten DLL adalah laman HTML: D Cobalah untuk memeriksa apakah ini file biner, apakah sepertinya DLL yang benar :)

Ludwo
sumber
1

Kami mengalami masalah yang sama di .NET core. Solusinya adalah mengunduh 32-bit .netcore runtime, dan memiliki target proyek Andax86

Di csprojfile Anda tambahkan

  <PropertyGroup>
    <PlatformTarget>x86</PlatformTarget>  
  </PropertyGroup>

  <PropertyGroup>
    <RunCommand Condition="'$(PlatformTarget)' == 'x86'">$(MSBuildProgramFiles32)\dotnet\dotnet</RunCommand>    
  </PropertyGroup>

Ini digunakan untuk mesin Windows, Anda harus menyesuaikan jalur dan semacamnya untuk Linux / OSX

Samir Banjanovic
sumber
0

Jika Anda mengimpor DLL yang tidak dikelola, gunakan

CallingConvention = CallingConvention.Cdecl 

dalam metode impor DLL Anda.

Ramkumar Shanmugam
sumber
0

1: Buka: Peralatan> Opsi> Proyek dan Solusi> Proyek Web> Gunakan versi 64 bit dari IIS Express 2: ubah pengaturan di bawah ini untuk proyek layanan web. masukkan deskripsi gambar di sini

Mani
sumber