Dosya veya montaj yüklenemedi… Yanlış biçime sahip bir program yüklenmeye çalışıldı (System.BadImageFormatException)


408

İki projem var ProjectAve ProjectB. ProjectBbağlı bir konsol uygulamasıdır ProjectA. Dün her şey yolunda gidiyordu, ama aniden bugün koştuğumda şunu alıyorum ProjectB:

BadImageFormatException işlenmedi :
Dosya veya montaj 'ProjectA, Sürüm = 1.0.0.0, Kültür = nötr, PublicKeyToken = null' veya bağımlılıklarından biri yüklenemedi. Yanlış biçime sahip bir program yüklenmeye çalışıldı.

Her ikisi de sadece normal projelerdir ve diğer .NET olmayan projelere bağımlı değildir. Her ikisi de tamamen .Net - yerel kod ve P / Invoke yok. Bağımlı olan ProjectAve hala iyi çalışan başka projelerim var .

Denediğim şeyler:

  • Her iki projenin de yapı onay kutusu işaretli olarak "Herhangi bir CPU" olarak ayarlandığından emin olun . Onlar.
  • Her iki projenin de aynı Hedef Çerçeve (.Net 4.0 İstemci Profili) için olduğundan emin olun .
  • ProjectB -> Başvurular -> ProjectA -> Özellikler altında, "Yerel Kopyala" nın "Doğru" olarak ayarlandığından emin olun _ (ProjectA.dll dosyasının doğru şekilde kopyalandığını doğruladım)
  • Çözümü temizleyin / yeniden oluşturun. Hatta her iki projede / bin ve / obj klasörlerini el ile silmeyi denedim.
  • Visual Studio'yu yeniden başlatın. Bilgisayarımı yeniden başlat.
  • Deponun tamamen yeni bir kopyasını inceleyin.

Ama yine de aynı hatayı alıyorum. Buna neden ne yaptığımı ya da nasıl düzeltebileceğimi bilmiyorum. Herhangi bir fikir?


1
Havuzda bir sürüm geçmişiniz varsa, csproj dosyalarında bazı farklılıklar olup olmadığını kontrol edebilir misiniz?
Steve

@Steve: Mercurial'a göre, yeni .cs dosyalarına referans eklemek dışında bir değişiklik yok
BlueRaja - Danny Pflughoeft

Aynı davranışı başka bir makinede mi alıyorsunuz? Makinede başka bir şey değişti mi (örn. Windows güncellemesi, bağımlılık güncellemeleri vb.)?
Mike Parkhill

Bu yeni .cs dosyalarını geri almayı denediniz mi?
Mike Parkhill

2
Bu benim için çalıştı ............ stackoverflow.com/a/9419522/191403
Som

Yanıtlar:


647

32-bit / 64-bit çakışması olduğundan eminim. Referansı verilen sınıf 64 bit olarak ayarlanmışken, ana projeniz 32 bit olarak ayarlanmış gibi görünebilir. Bu SO sorusuna ve buna da bakmayı deneyin . İkisi arasında, probleminizi anlayabilmelisiniz.


71
Do'h. Ben bir şekilde tamamen "platform hedefi" açılan eksik project-->properties-->build- x86 için ayarlanmış; "Herhangi bir CPU" olarak ayarlamak bu sorunu çözdü. Her zaman bu ayarın yapılandırma yöneticisindeki "platform hedefi" açılır listesiyle aynı olduğunu düşündüm, ancak görünüşe göre öyle değil (aslında, yapılandırma yöneticisindeki "platform hedefi" hiçbir şey yapmıyor gibi görünüyor!)
BlueRaja - Danny Pflughoeft

10
Ayrıca projenin 32 bit tercihli herhangi bir CPU olmadığını kontrol edin. Proje -> özellikler -> yapı
Reid Evans

26
Not: Başka bir neden, uygulama havuzu ayarlarında "32 bit uygulamaları etkinleştir" in "false" olmasıdır. Doğru değerine ayarladıktan sonra IIS'yi yeniden başlatmanız gerekir.
dvdmn

3
Bu hatayla başıma gelen en kötü şey, VS'nin <PlatformTarget>x86</PlatformTarget>bağımlı projelerden birine sebepsiz yere eklemeye karar vermesiydi . SVN'ye bakmasaydım, MVC uygulamamızın neden başlatılamadığını asla anlayamazdım.
jahu

1
Lütfen IIS'de ayarlayın DefaultAppPool-> 32 Bit Uygulamaları Etkinleştir = Doğru
Shantu

195

Sunucuya dağıtıldıktan sonra web sitenizle ilgili sorun yaşıyor olabilirsiniz.

Ardından, uygulama havuzunuzu 32 Bit Uygulamaları Etkinleştir'e ayarlamanız gerekir .

adımlar

  1. IIS Yöneticisi'ni açın
  2. Uygulama Havuzları'na tıklayın
  3. Kullandığınız uygulama havuzunu seçin
  4. Sağ bölmeden Gelişmiş Ayarlar'ı tıklayın ...

  5. 32 Bit Uygulamaları Etkinleştir'i Doğru olarak ayarlayın

    Gelişmiş Ayarlar 32 Bit'i etkinleştir


1
Bir şey mi kaçırdım? OP, IIS dağıtımından değil bir konsol uygulaması hakkında konuşuyor : "ProjectB,
ProjectA'ya

129

Bu hata iletisini Visual Studio 2015'te IIS Express çalıştırırken aldım. Benim durumumda IIS Express'in 64 bit sürümünü çalıştırmam gerekiyordu:

Araçlar → Seçenekler → Projeler ve Çözümler → Web Projeleri
"Web siteleri ve projeler için IIS Express'in 64 bit sürümünü kullanın" yazan kutuyu işaretleyin.

Ekran görüntüsü:

Web Project için VS seçeneklerinin ekran görüntüsü.


2
Bunun tersi geçerlidir,
'64

32

Aynı sorunu yaşadım. Project A'nın "Platform Hedefi" ni ("Project A" (Sağ Tıklama) -> Özellikler-> Oluştur -> "Platform Hedefi") x86 olarak ayarladım, ancak Project B'leri "Any CPU" da tuttum. Proje B'leri "x86" olarak ayarlamak bunu düzeltti.


15

Visual Studio 2015'te birim testleri (xunit) çalıştıran bu sorun vardı ve aşağıdaki düzeltmeye rastladım:

Menu Bar -> Test -> Test Settings -> Default Processor Architecture -> X64

7

Projenizde en az 1 32bit dll \ exe varsa, IIS7'de "32bit Uygulamaları Etkinleştir" Uygulama Havuzu ayarını TRUE olarak değiştirmeniz gerekebilir .


OP IIS değil bir konsol uygulaması hakkında konuşuyor
MickyD

5

Her şeyden önce ben bir hale getirmek için gerekli eski proje ile VS2017 bu var küçücük değişikliği ve çerçeve 4.7 için tüm projeleri upraded.


Bazıları seçmenin Any CPUbu sorunu çözebileceğini belirtti.

Yapmanız gereken birkaç yer var ve sadece açılır menüden seçim yapmak kadar basit olmayabilir. Bu benim için düzeltti:

1) Her ikisini de burada yapmanız gerekir:

resim açıklamasını buraya girin

2) Ve ayrıca Configuration Manager(çözüme sağ tıklayın)

resim açıklamasını buraya girin

Ama ya orada değilse ???

Ardından tıklayın Newve şu ayarları seçin: ( teşekkürler @RckLN )

resim açıklamasını buraya girin


2

Aynı çözümde birden fazla proje ile aynı sorunu vardı, ben hedef CPU için .NET Framework 4 ve x86 için tüm hedef çerçeveleri ayarlama sona erdi ve sonunda başarıyla derlendi.


1
Release'de çalıştı ancak Debug'da başarısız oldu. Hepsini .Net Framework 4 (Güncelleme 1 DEĞİL) olarak ayarlayın ve Hata Ayıklama şimdi çalışır.
DCastenholz

2

Ayrıca, 64 bitlik bir projeyi VS'de bir MSI yükleyicisiyle paketlemeye çalışıyorsanız da bu sorunu görebilirsiniz. ("Bunun nedeni, .msi dosyasıyla paketlenmiş yerel şimin 32 bit yürütülebilir olmasıdır.")

Daha fazla ayrıntı için buraya bakın: http://blogs.msdn.com/b/heaths/archive/2006/02/01/64-bit-managed-custom-actions-with-visual-studio.aspx


1
Bağlantılı makaleyi gelecekteki okuyucuların yararına özetlemeyi düşünün; bağlantının kopması durumunda.
Bond - Java Bond

2

Bu çözümlerin hiçbiri benim için işe yaramadı - ancak bin ve obj klasörlerinin içeriğini silerek her şey tekrar güzeldi.


2

Bu Visual Studio Buildadımları kullanarak Visual Studio Online (VSTS) Build üzerinden bir proje oluştururken aldım .

Çözüm şuydu:

  • Mevcut kaynak klasörü sil
  • Bağımlılıklar dahil tüm Visual Studio Builds için platformda açıkça 'Herhangi bir CPU'yu ayarlayın (aşağıdaki ekran görüntüsüne bakın).
  • Derlemeyi yeniden çalıştırın

VSO Ekran Görüntüsü


2

Aşağıdakiler benim için sorunu çözdü, '32 bit'i tercih et' seçeneğinin işaretini kaldırın: resim açıklamasını buraya girin


1

Aynı sorunla karşılaştım. Maviden çıktı ve bu bana garip geldi.

İstisna anlık görüntüsünde, FusionLog için mesajında ​​aşağıdakileri gördüm:

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

Füzyon günlüğü hakkında daha fazla bilgi: http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.110).aspx

Tüm projelerin AnyCPU Hedef CPU'su vardı. Uygulama projesini (diğer tüm projelere başvuran proje) x86 Hedef CPU olarak değiştirdim. Şimdi çalışıyor.

Hedef CPU karışımının nasıl görünür bir sebep olmadan gerçekleştiğinden emin değilim, ama oldu.


1

Bir projede de bu sorunla karşılaşıyorum, birkaç dakika sonra çözümü buldum, bu sorun CPU yapılandırmasından kaynaklanıyor, Visual Studio 2010 veya VS 2013 kullanıyorsanız , sadece projenin özelliklerine git ve sonra yan çubuktan derle'yi seç ve 5 açılır, 5. Açılır Hedef CPU olacaktır : Herhangi bir CPU yerine gereksinimlerinize göre x86 veya x64 olarak ayarlamanız gerekir .

Sorunum x86 olarak değiştirildikten sonra çözüldü.


1

Bu, yalnızca app.config dosyasında tanımlanmış birden çok desteklenen çerçeveye sahip olmak ve uygulamayı , app.config dosyasında ilk sırada belirtilenin dışında farklı bir .NET çerçevesinde çalışmaya zorlamakla da olabilir .

Ayrıca, sisteminizde belirtilen çerçevelerin her ikisine de sahip olduğunuzda da tetiklenir.

Geçici bir çözüm olarak, app.config dosyasında hata ayıklama için kullanacağınız hedef çerçeveyi getirin

örn: .NET 4'te çalıştırmayı deniyorsanız, yapılandırma dosyasında buna benzer bir şey olmalıdır,

<supportedRuntime version="v4.0"/>
<supportedRuntime version="v2.0.50727"/>

1

C # için projemde, project property -> [Build] -> Platform hedefi: Herhangi bir CPU'yu seçin ve derleyicinin otomatik olarak seçim yapmasına izin vermek için 32-bit tercihini kaldırın.


1

Chilkat .NET 4.5 derlemesi, uygulamanızın çalıştığı herhangi bir bilgisayara VC ++ 2012 veya 2013 çalışma zamanının yüklenmesini gerektirir. Çoğu bilgisayarda zaten yüklüdür. Visual Studio yüklendiği için geliştirme bilgisayarınız buna sahip olacaktır. Ancak, gerekli VC ++ çalışma zamanının kullanılamadığı bir bilgisayara dağıtım yapılırsa, yukarıdaki hata ortaya çıkar:

Tüm körük paketlerini takın

Visual Studio 2013 için Visual C ++ Yeniden Dağıtılabilir Paketleri - vcredist_x64

Visual Studio 2013 için Visual C ++ Yeniden Dağıtılabilir Paketleri - vcredist_x86

Visual Studio 2012 için Visual C ++ Yeniden Dağıtılabilir Paketleri - vcredist_x64

Visual Studio 2012 için Visual C ++ Yeniden Dağıtılabilir Paketleri - vcredist_x86



0

Biraz komik olabilir, ama normal çalışma kodu ile aynı sorunu yaşadım. StreamWriter ve StreamReader'ı ekledim ve bu hatayı verdi. Çözüm, bu kodu yorum parantezine aldım, sonra hata ayıkladım ve tekrar çalışmaya başladı.



0

Benim durumumda bu istisna attı dll bir bağımlılık eksikti. Dependency Walker ile kontrol ettim, eksik dll'yi ekledim ve sorun çözüldü.

Daha spesifik olarak, bir şekilde yanlışlıkla SVN anahtar kelimeleri ekleyerek benim opencv_core340.dll bozuk ve böylece benim dll artık kullanamaz. Ancak bu sorunun çözümü dll bozuk veya eksik olup olmadığına bağlıdır inanmıyorum. Bunu tam bilgi vermek için ekliyorum.


0

Ateş etmek! Bu sorunu biliyordum. Yanlışlıkla VS çıkış penceresinde 'x86' görene kadar her şeyi doğru yaptığımı sanıyordum ve o zaman sebebi yakaladım. Bugün birkaç dakika harcadım.

'Yayınla' penceresinin altındaki yapılandırma 'x86' olarak ayarlandı; oysa diğer her yerde 'x64' idi.

Lütfen yapılandırma yöneticisi, yayınlama ayarları, çözüm yapılandırmaları ve IIS ayarlarında (web sunucunuz buysa) senkronize olduğundan emin olun.

Ayrıca, lütfen aklınızda bulundurun - VS 32 bit bir uygulama ve IIS 64 bittir. 32 bit uygulamalar IIS'de varsayılan olarak devre dışıdır.

resim açıklamasını buraya girin


0

Diğer cevaplardan farklı bir şey tespit ettim. Projemde bu istisnayı yakalamak bozuk bir derlemenin sonucuydu. Herhangi bir değişiklik yapmadan, sadece yeniden inşayı zorlayarak düzeltildi.


0

Aynı sorunu yaşadım. Benim durumumda proje B, Nuget "Microsoft.Management.Infrastructure" yüklü bir .Net Core Class Library oldu. Hata ben benim proje B "MI" denir oldu. Proje adını başka bir şeyle değiştirdim ve aniden her şey tekrar çalıştı.


-1

Makinem bana bir BIOS güncellemesi gösterdi ve bunun bu hatanın aniden ortaya çıkmasıyla ilgili bir şey olup olmadığını merak ettim. Güncellemeyi yaptıktan sonra hata çözüldü ve çözüm iyi bir şekilde oluşturuldu.


-1

.Exe dosyanızı cmd'den çalıştırmaya mı çalışıyorsunuz? Bu benim hatamdı. Sadece .exe dosyasını çift tıklatarak çalıştırın. Windows 8.1 / Windows Server 2012 R2 x64 için bir .NET Core SCD ise.

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.