Platformlar aynı olsa bile “yanlış biçime sahip bir program yüklenmeye çalışıldı”


461

64-bit bir sistemde 32-bit yönetilmeyen DLL işlevleri çağırıyorum. Ne olsun:

BadImageFormatException: Yanlış biçime sahip bir program yüklenmeye çalışıldı. (HRESULT istisnası: 0x8007000B)

İlk başta, projelerimi Any CPU platformuna ayarladım, bu yüzden ikisini de x86 olarak değiştirdim, ancak bu hata hala oluşuyor. Bunun için bildiğim tek düzeltme bu.

DLL'leri bozuk veya başka bir şey değil, çünkü onları (ben kaynak yok) diğer programlarla kullanabilirsiniz. Belki bir bağımlılık bulamadığını düşündüm, ama kontrol ettim ve hepsi orada. Artı, DllNotFoundExceptionbu durumda a atmaz mıydı?

Başka ne yapabilirim? "Bunun yerine 64 bit yönetilmeyen bir DLL kullanın" demeden önce, bir tane olmadığını belirteyim. ;)


1
Hangi projeleri x86 olarak değiştirdiniz? İstisna olduğunda hata ayıklayıcı aracılığıyla veya manuel olarak bunları nasıl yürütürsünüz? İkincisi, x86 olarak değiştirdiğinizde bin \ dizininizde yeni bir klasör olduğunu fark ettiniz mi? Temelde dosyalar için bin \ x86 \ Debug.
Lasse V. Karlsen

Yürütülebilir dosyanın 32 bit modunda (işlem yöneticisinde * 32) çalıştığını doğrulayabilir misiniz?
JP Alioto

@Lasse V. Karlsen: Evet, her projede platformu değiştirdiğimde x86 bitini çıkış yolundan çıkardım. İlk projem, yönetilmeyen DLL'deki işlevleri saran bir DLL dosyasıdır. İkinci proje, ilk DLL dosyasında sarmalayıcı kullanan bir yürütülebilir dosyadır. Her ikisi de x86 olarak ayarlanmıştır.
David Brown

@JP: Aslında, işlem yöneticisi 32 bitlik bir işlem olarak çalıştığını göstermiyor. Neden?
David Brown

Yanıtlar:


532

IIS 7'de (ve / veya 64 bit OS makinesinde) 32 bit uygulamalar çalıştırmayı denerseniz, aynı hatayı alırsınız. Bu nedenle, IIS 7'den uygulamaların uygulama havuzuna sağ tıklayın ve "gelişmiş ayarlar" a gidin ve "32 Bit Uygulamaları Etkinleştir" i "DOĞRU" olarak değiştirin.

Web sitenizi yeniden başlatın ve çalışması gerekir.

resim açıklamasını buraya girin


1
Ah benim gün bu cevap oldu ekstra IIS bileşenleri yükleme etrafında balıkçılık oldu ... Herkes bu seçeneğin seçili olmasının bir dezavantajı önerebilir?
notidaho

3
İşte bununla ilgili performans sorusu hakkında iyi bir tartışma: stackoverflow.com/questions/507820/…
Ben Power

SharpSvn ile ilgili bir sorunum var ve bu yardımcı olmuyor. :( Sth bu derleme ile çok yanlış sana söylüyorum ...
user2173353

4
Bu cevap benim için bir wtf, çünkü soru IIS'den hiç bahsetmiyor!
kristianp

129

Her nasılsa, Yapılandırma Yöneticisi'ndeki Oluştur onay kutusunun yürütülebilir dosyam için işareti kaldırılmıştı, bu yüzden hala eski Any CPU derlemesiyle çalışıyordu. Bunu düzelttikten sonra, Visual Studio derlemede hata ayıklamadığından şikayet etti, ancak bu yeniden başlatma ile düzeltildi.


Çok teşekkürler. Bu da beni yakaladı. Yapılandırma Yöneticisi'nde derleme kontrol edildi ve şimdi çalışıyor (WPF masaüstü uygulaması).
danglund

1
Yukarıdakilerin tümünü yaptıysanız ve platform ayarınızı kontrol ettiyseniz, yapılandırma ayarlarını oluşturun, çözümü temizleyin ve hala çalışmıyorsa, DLL'in tüm örneklerini arayın ve silin.
Calderwood

VS 2015 ile bu hala geçerli - yeniden başlatmaya gerek yoktu rağmen :)
increddibelly

Bu kadar! Cevabı Configuration Manager ayarlarınızı tekrar ziyaret edin.
AndyUK

74

Gelen Visual Studio , Sağ senin Click projeyi -> Sol bölmede tıklayın Yapı sekmesini,

Proje özellikleri, derleme sekmesi

Platform Hedefi altında x86'yı seçin (veya daha genel olarak bağlandığınız kitaplıkla eşleşecek mimariyi )

Proje özellikleri, platform hedefi

Umarım bu birine yardımcı olur! :)


2
Bu VS2013 sorunumu düzeltti, alternatif bir düzeltme "Platform hedefi" "Herhangi bir CPU" olarak bırakmak ama "32-bit tercih" onay kutusunu işaret bulundu.
user1069816

2
"32-bit'i tercih et" onay kutusunu işaretleyebilmek için .NET 4.5 veya üstünü kullanmanız gerekmesine rağmen
user1069816

1
Evet, ancak 'Herhangi bir CPU'daki projemi' x64'e dönüştürdüm. Benim 32 bit proje iyi çalışıyor ama aynı kod 64 bit dönüştürdü, bu proje 32 bit iyi çalışmıyor. Bana uygun 64 bit dönüşüm sürecini verebilir misiniz ...
Ismayil S

@IsmayilS, bağlandığınız kütüphanenin 64 bit sürümünü kullandığınızdan emin olun
Marvin Thobejane

53

Ben de bu sorunu yaşadım. Burada tüm önerileri denedim, ama yardım etmediler.

Bunu düzeltmek için başka bir şey buldum. Visual Studio'da, projeye sağ tıklayın ve "Özellikler" i açın. "Derle" (veya "Derleme") sekmesini ve ardından alttaki "Gelişmiş Derleme Seçenekleri" ni tıklayın.

"Hedef CPU" açılır menüsünü kontrol edin. Oluşturduğunuz "Platform" ile eşleşmelidir. Yani, "Herhangi bir CPU" oluşturuyorsanız, "Hedef CPU", "Herhangi bir CPU" demelidir. Aktif hale getirerek tüm Platformlarınızı gözden geçirin ve bu ayarı kontrol edin.


2
Ve sadece derleyiciyi kullananlar için, düzeltmem derleyici bayraklarına "/ platform: x86" eklemekti.
Urchin

Bu benim için de düzeltildi. "Derleme" sekmesindeki "platform hedefini" ayarlamak zorundaydım.
Jowen

64 bit kullanıyorsanız, "32 bit tercih" bayrağını da kontrol edin. Benim için devre dışı bırakmak zorunda kaldım.
N4ppeL

51

Uygulamayı çalıştırmak için yeşil ok düğmesini tıklattığınızda bu hatayla karşılaşırsanız, ancak uygulamayı 64 bit'te çalıştırmak istiyorsanız. Bunu VS 2013, 2015, 2017 ve 2019'da yapabilirsiniz

Araçlar> Seçenekler> Projeler ve Çözümler> Web Projeleri> IIS Express'in 64 bit sürümünü kullanma


3
Teşekkürler. Ben çok denedim ve hiçbir şey yardımcı olmadı. Sen benim hayat kurtarıcımsın. 64bit işletim sistemim var, 64 bitlik bir Visual studio yükledim [bilinmeyen bir nedenden dolayı hala 32bit olarak çalışıyor]. Platform Hedefimi x64'e koyduğumda BadImageFormatException hatası atıyordu. Düzeltmenizle işe yaradı. Sana bir oy verdim. You rock
SKCS Kamal

Yardım edebileceğime sevindim :)
paibamboo

İhtiyacım olan cevap bu. Çok teşekkürler!
yushulx

Çok teşekkürler, bu sorunu çözdü. Visual Studio 2017 32 bit işlemiyle iyi çalışır.
samir105

1
hala VS 2019 ile çalışıyor, teşekkür ederim
Jake Gaston

36

Herhangi bir CPU kullanıyorsanız , 32-bit'i tercih et seçeneği işaretliyse bu sorunla karşılaşabilirsiniz :

Projenin özelliğinin Oluştur sekmesinde bu seçeneğin işaretini kaldırdığınızdan emin olun !

resim açıklamasını buraya girin


3
Bu seçeneği bulmak için Visual Studio'da nerede olduğunu belirtebilirsiniz.
trysis

@trysis, bu seçenek proje ayarları bölmesinin Oluştur sayfasındadır.
Drew Noakes

1
Bunu koymak yararlı olacağını söylüyordum. Bu cevap duruyor gibi, StackOverflow, muhtemelen yeni bulmak nereye kullanıcı bulmak için hiçbir bağlam yoktur.
trysis

Bu formu almanın yolu nedir? Ben bulamıyorum
Adolfo Correa

Visual Studio'da, projeyi sağ tıklatın ve 'Özellikler'i seçin.
Drew Noakes

8

Bu yazı için biraz konu dışı, ancak bu hata mesajını aramak beni buraya getirdi.

Ekip sistemi üzerinden yapıyorsanız ve bu hatayı alıyorsanız, derleme tanımı işlem sekmesinde "MSBuild Platform" ayarı bulunur. Bu "Otomatik" olarak ayarlanırsa, bu sorunla karşılaşabilirsiniz. Bunu "X86" olarak değiştirmek de hatayı çözebilir.


bu yaşadığım şeyin en yakın cevabı. X86 olması gereken bir dll vardı. Varsayılan olarak AnyCPU olan başka bir projede kullandım. Sadece eşleşmeleri gerekiyor. Bu durumda, çok fazla fark yaratmadı, bu yüzden yeni projeyi x86 olarak değiştirdim.
greg

8

Benim durumumda C # yerel bir DLL kullanıyordum. Bu DLL eksik diğer DLL birkaç bağlıydı. Bu diğer DLL'ler eklendiğinde her şey işe yaradı.


4

@Paibamboo cevabı üzerine inşa

Dedi: Git: Araçlar> Seçenekler> Projeler ve Çözümler> Web Projeleri> IIS Express'in 64 bit sürümünü kullanın

İş arkadaşım bu kutuyu işaretlemişti (açıkça aradı), ancak söz konusu hata mesajını aldı. Birkaç saat sonra kutunun işaretini kaldırıp tekrar kontrol etti. Bakın: Kod şimdi başarılı bir şekilde çalıştı.

Görünüşe göre, bu kutunun durumunun kaydedildiği, senkronize olmayan iki yer var. Un- ve yeniden kontrol edilmesi tekrar senkronize etti.

Daha bilgili kullanıcılar için soru: Geçen hafta (VS 2015 için) durumları silen bir güncelleme veya başka bir şey var mıydı?


3

Aynı problemi benim için çözen bu cevaba da bakınız .

Gönderen Luis Mack 05.05.2010 08:50 Saat Aynı sorunu, 64 bitlik bir makinede derlerken sadece belirli bir proje için buldum. SEEMS'in çalışması için bir düzeltme, HER ZAMAN görüntü akışındaki bir karakteri manuel olarak değiştirmektir. Kullanıcı kontrolü veya formu tasarımcıda düzenlenir

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w

Değişmek

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w

Bu, satırın sonunda 00LjAuMC4w'ye geri 0yLjAuMC4w (00'dan 0y'ye geri )


1
Kısa bir özet bağlantı yararlı olacaktır @Shaul :)
Marvin Thobejane

Muhteşem. Teşekkürler, brifing yorumlarınıza içerik ekler
Marvin Thobejane

2

Benim durumumda, yansıma yoluyla başvurulan DLL'leri yeniden yükleyen küçük bir .exe kullanıyorum. Bu yüzden sadece günümü kurtaran bu adımları yapıyorum:

Solution Explorer'daki proje özelliklerinden derleme sekmesinde x86 hedef platfromunu seçiyorum


2

Benim durumumda, MSTest aracılığıyla testler yürütüyordum ve test dizinine hem 32 bit hem de 64 bit DLL dağıttığımı öğrendim. Program 64-bit DLL lehine ve başarısız olmasına neden oldu.

TL; DR Testlere yalnızca 32 bit DLL dosyaları dağıttığınızdan emin olun.


2

Benzer bir sorun yaşadık ve Platform hedefini x86 olarak ayarlayarak düzeltmeyi başardık. Proje Özellikleri-> derleme


Yani x86 dll x64 farklı? Başvurulan bir dll dosyasında bunu tespit etmek için bir yolu var mı?
NoBugs

@NoBugs Yapabileceğin gibi görünüyor. Bu konuya
Joe

1

Bu sorunu 'Windows' şeklinde çözdüm. Tüm ayarlarımı kontrol ettikten, çözümü temizledikten ve yeniden oluşturduktan sonra, sadece çözümü kapatıp yeniden açtım. Sonra işe yaradı, bu yüzden VS muhtemelen temizlik sırasında bazı şeylerden kurtulmadı. Mantıksal çözümler işe yaramadığında, genellikle mantıksız (veya görünüşte mantıksız) çözümlere yönelirim. Windows beni hayal kırıklığına uğratmıyor. :)


1

Derleme sürümümü sunucudaki .NET sürümüyle eşleştirerek bu sorunu çözebildim.

Ben sadece ne olacağını görmek için .exe çift tıkladı ve 4.5 yüklememi söyledi ....

Bu yüzden 4.0'a düştüm ve işe yaradı!

Bu yüzden sürümlerinizin eşleştiğinden emin olun. Benim dev kutusu iyi koştu, ama sunucu eski .NET sürümü vardı.


1

Benim durumumda dosyanın içeriği yanlıştı. DLL web'den indirildi, ancak DLL içeriği HTML sayfasıydı: D Doğru DLL gibi görünüyorsa, ikili dosya olup olmadığını kontrol etmeyi deneyin :)


1

Aynı sorunu .NET çekirdeğinde de yaşıyorduk. Çözüm, 32 bit .netcore çalışma zamanını indirmek ve proje hedefinize sahip olmaktıx86

Senin içinde csprojdosya ekleme

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

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

Bu bir Windows makinesi için kullanıldı, Linux / OSX için yolları ayarlamanız gerekirdi


0

Yönetilmeyen DLL'yi içe aktarıyorsanız,

CallingConvention = CallingConvention.Cdecl 

DLL alma yönteminizde.


0

1: Git: Araçlar> Seçenekler> Projeler ve Çözümler> Web Projeleri> IIS Express 2'nin 64 bit sürümünü kullanın: web hizmeti projesi için aşağıdaki ayarı değiştirin. resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.