BadImageFormatException ile İlgili Sorunları Giderme


107

Visual Studio 2010 kullanarak C # ile yazılmış ve tam .NET Framework 4'ü hedefleyen bir Windows hizmetim var. Bir Debug derlemesinden çalıştırdığımda hizmet beklendiği gibi çalışıyor. Ancak, bir Sürüm yapısından çalıştırdığımda bir System.BadImageFormatException alıyorum (ayrıntılar aşağıda). İnternette bir çözüm arıyordum ama şimdiye kadar bulduğum her şey bir çözüm bulmama yardımcı olmadı.

Sorun hem Windows 7 64 bit (dev) hem de Windows XP SP3 32 bit (hedef) sistemlerde mevcuttur.

İşte şimdiye kadar denediğim şey:

  • Platform Hedefi gibi doğrulanmış derleme ayarlarının tümü aynıdır (x86).
  • Derleme ikili dosyalarının geçerli olduğundan emin olmak için / verbose seçeneğiyle peverify kullanıldı.
  • Yükleme sorunlarını aramak için fuslogvw kullanır.
  • Eksik dosyaları veya derlemeleri aramak için CheckAsm kullanılır.

Tüm bu kontroller hiçbir şeyi değiştirmedi. Kurumsal ustalarımın sırlarını korumak için bazı isimler değiştirilerek istisna bilgilerinin tam metnini aşağıya ekledim.

System.BadImageFormatException işlenmedi
  Mesaj = Dosya veya derleme 'XxxDevices, Sürüm = 1.0.0.0, Culture = nötr, PublicKeyToken = null' veya bağımlılıklarından biri yüklenemedi. Yanlış biçime sahip bir program yüklenmeye çalışıldı.
  Kaynak = XxxDevicesService
  FileName = XxxDevices, Version = 1.0.0.0, Culture = nötr, PublicKeyToken = null
  FusionLog = Montaj yöneticisi şuradan yüklenir: C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ clr.dll
Yürütülebilir c: \ Dev \ TeamE \ bin \ Release \ XxxDevicesService.vshost.exe altında çalışıyor
--- Ayrıntılı bir hata günlüğü aşağıdadır. 

=== Bağlanma öncesi durum bilgisi ===
GÜNLÜK: Kullanıcı = XXX
GÜNLÜK: DisplayName = XxxDevices, Sürüm = 1.0.0.0, Kültür = nötr, PublicKeyToken = null
 (Tam olarak belirtilmiş)
GÜNLÜK: Appbase = file: /// c: / Dev / TeamE / bin / Release /
GÜNLÜK: İlk ÖzelYol = NULL
Çağrılan derleme: XxxDevicesService, Sürüm = 1.0.0.0, Kültür = nötr, PublicKeyToken = null.
===
LOG: Bu bağlama, varsayılan yükleme bağlamında başlar.
GÜNLÜK: Uygulama yapılandırma dosyasını kullanarak: c: \ TeamE \ bin \ Release \ XxxDevicesService.vshost.exe.Config
GÜNLÜK: Ana bilgisayar yapılandırma dosyasını kullanarak: 
GÜNLÜK: C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ config \ machine.config'den makine yapılandırma dosyasını kullanarak.
GÜNLÜK: İlke şu anda referansa uygulanmıyor (özel, özel, kısmi veya konuma dayalı derleme bağlama).
GÜNLÜK: Yeni URL dosyası indirilmeye çalışılıyor: /// c: /TeamE/bin/Release/XxxDevices.DLL.
HATA: Derlemenin kurulumu tamamlanamadı (hr = 0x8007000b). İnceleme sonlandırıldı.

  Yığın izleme:
       XxxDevicesService.Program.Main (String [] değiştirgeler)
       System.AppDomain._nExecuteAssembly (RuntimeAssembly, String [] args)
       Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly ()
       System.Threading.ExecutionContext.Run (ExecutionContext executionContext, ContextCallback geri çağrısı, Nesne durumu, Boolean ignoreSyncCtx)
       System.Threading.ExecutionContext.Run (ExecutionContext executionContext, ContextCallback geri çağrısı, Nesne durumu)
       System.Threading.ThreadHelper.ThreadStart ()
  InnerException: 
c#  .net  exception 

yerel kodu / .net'i karıştırıyor musunuz?
Keith Nicholas

1
Bu istisnanın x86 / x64 bit farklarıyla ilişkili olduğu konusunda doğru yoldasınız. Bunun bir web uygulaması olmadığını varsayıyorum, değil mi? Ayrıca, ne tür bir montaj XxxDevicesService? Belirli bir platform için derlenmiş mi (örneğin 32 bit)? Eğer öyleyse, platformunuzu 32 bit olarak derlemelisiniz.
Reddog

Yanıtlar:


121

Platform Hedefi gibi doğrulanmış derleme ayarlarının tümü aynıdır (x86).

Çökme günlüğünün söylediği bu değil:

Montaj yöneticisi şu konumdan yüklenir: C: \ Windows \ Microsoft.NET \ Framework64

Adındaki 64'e dikkat edin, bu çerçevenin 64 bit sürümünün ana sayfasıdır. Sınıf kitaplığı projenizde değil, EXE projenizde Hedef platform ayarını belirleyin . XxxDevicesService EXE projesi, işlemin bitliğini belirler.


6
Ve EXE Debug hem kontrol PROJE- kontrol ediyoruz ederken ve Release. : /
chris

44

Bu sorunu çözmek için harcadığım haftanın tamamını düşünerek başımı masaya vurmayı bıraktıktan sonra, benim için neyin işe yaradığını paylaşıyorum. Win7 64 bit, 32-bit Oracle Client'ım var ve MVC 5 projem Oracle bitliği nedeniyle x86 platformunda çalışacak şekilde ayarlandı. Aynı hataları almaya devam ettim:

Dosya veya derleme 'Oracle.DataAccess' veya bağımlılıklarından biri yüklenemedi. Yanlış biçime sahip bir program yüklenmeye çalışıldı.

NuGet paketlerini yeniden yükledim, farklı uygulamalarda başkaları için çalışan DLL'lerin kopyalarını kullandım, bağımlı derlemedeki kod tabanını projemin bin klasörüne işaret edecek şekilde ayarladım, CopyLocal'ı doğru veya yanlış olarak denedim, her şeyi denedim . Sonunda yeterince başka şey yaptım, kodumu kontrol etmek istedim ve yeni bir müteahhit olarak yıkım kurulumuna sahip değildim. VS'ye bağlamanın bir yolunu ararken, cevabın üzerinden geçtim. İşe yaradığını bulduğum şey, Araçlar => Seçenekler menüsü altındaki Projeler ve Çözümler => Web Projeleri bölümündeki "Web Siteleri ve Projeler için IIS Express'in 64 bit sürümünü kullan" seçeneğinin işaretini kaldırmaktı.


3
Ne cankurtaran !! Teşekkür ederim. Benim için bunu gerçekten kontrol etmeliydim, çünkü projem etkin bir şekilde x64. Tekrar teşekkürler!!!
viper

Burada aldığım onca yardımdan sonra, bir kısmını geri ödeyebildiğim için çok mutluyum!
Joseph Morgan

3
Yerel IIS kullananlar için, uygulama havuzunuzun "32 Bit Uygulamaları Etkinleştir" in (Gelişmiş Ayarlar altında) Doğru olarak ayarlandığından emin olun .
Eric Eskildsen

@ EricEskildsen'in uygulama havuzunda "32 bit uygulamaları etkinleştir" hakkındaki yorumuna ek olarak, bunu canlı ortamda yapmak istemeseniz bile, bu anahtarı çevirmek, 32 bit ile karşılaşıp karşılaşmadığınız konusunda ek ipuçları sağlayabilir. -bit / 64-bit problemi veya başka bir şey.
bir CVn

Boom! İşte buydu.
itslittlejohn

21

İşe yaradığını bulduğum şey, Araçlar => Seçenekler menüsü altındaki Projeler ve Çözümler => Web Projeleri bölümündeki "Web Siteleri ve Projeler için IIS Express'in 64 bit sürümünü kullan" seçeneğini işaretlemekti.


sen kurtarıcısın. +1
Amit Kumar

VS'yi yeniden yükledim ve bu sorunu gideriyordum (teşekkür ederim - bu çözüm işe yaradı). Hikayenin ahlakı, başlangıçta herhangi bir kodu değiştirmediğimi biliyorsam, belki de önce VS'nin yapılandırmasına bakmalıyım.
taylorswiftfan

@Lucy 'Web Siteleri ve Projeler için IIS Express'in 64 bit sürümünü kullan' onay kutusu desabled
k_kumar

Lütfen
Lucy'ye

12

Genellikle .csproj'un hedef çerçevesini değiştirdiğinizde ve başladığınız şeye geri döndürdüğünüzde ortaya çıkabilir.

App.config içindeki başlangıç ​​etiketinin altında supportedRuntime version = "cs proje hedefinden farklı bir çalışma zamanı" ise 1 olduğundan emin olun.

Emin olun 2 Bu aynı zamanda, bu dosyalar ile .csproj dosyasında tanımlanan dosya arasında daha fazla çalışma zamanı uyuşmazlığı olup olmadığını görmek için diğer otomatik oluşturulmuş veya diğer dosyaları kontrol etmek, özellikler klasörü olabilir.

Bunlar, hatanın üstesinden gelmek için proje özellikleriyle farklı şeyler denemeye başlamadan önce size çok zaman kazandırabilir.


Benzer bir sorunla karşılaştım ve cevabınız benimkinin çözümü oldu. App.config dosyamın desteklenen farklı çalışma zamanı vardı.
Krisztián Kis

9

64-bit Windows 7'ye sahip olmama ve Proje özelliklerinde 64 bit DLL b / c yüklememe rağmen aynı sorunu yaşadım | Build "32-bit'i tercih et" seçeneğini işaretledim. (Bunun neden varsayılan olarak ayarlandığını bilmiyorum). Kontrol etmediğimde her şey yolunda gitti


1
Burada aynı. Bu hile yaptı. 64 bitlik bir derlemeye başvuruldu ve etkin derleme yapılandırması Herhangi bir CPU olarak ayarlandı, ancak bu "32 biti tercih et" ayarından dolayı uygulamayı çalıştırırken muhtemelen 32 bit kullanıldı ve sorunlara neden oldu.
Bernoulli IT

Hata Ayıklama modunda x86 yerine Herhangi bir CPU seçildi ve harika çalıştı.
Cardi DeMonaco Jr

7

Bu istisnayı, uygulamanız .NET Framework 4.5'i hedeflediğinde (örneğin) ve aşağıdaki app.config'e sahip olduğunuzda da alabilirsiniz:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v2.0.50727" />
    <supportedRuntime version="v4.0" />
  </startup>
</configuration>

Uygulamanın hata ayıklamasını başlatmaya çalışırken BadImageFormatException'ı alacaksınız.

V2.0 sürümünü bildiren satırı kaldırmak hatayı temizleyecektir.

Son zamanlarda hedef platformu eski bir .NET 2.0 projesinden .NET 4.5'e değiştirmeye çalıştığımda bu sorunu yaşadım.


6

Arka fon

Bunu bugün, IIS 6.2 çalıştıran bir Windows 2012 R2 sunucusunda WCF hizmetimizi AnyCPU'dan x64'e geçirdiğimizde almaya başladık.

İlk olarak, aslında bir x86 dll olmadığından emin olmak için yalnızca başvurulan derlemeyi 10 kez kontrol ettik. Daha sonra 32 bit uygulamaları etkinleştirmediğinden emin olmak için uygulama havuzunu birçok kez kontrol ettik.

Bir hevesle ayarı değiştirmeye çalıştım. IIS'deki uygulama havuzlarının varsayılan olarak False 32-Bit Uygulamaları Etkinleştir değerine ayarlandığı ortaya çıktı, ancak IIS bunu bir nedenle sunucumuzda yok sayıyordu ve hizmetimizi her zaman x86 modunda çalıştırıyordu.

Çözüm

  • Uygulama havuzunu seçin.
  • Uygulama Havuzu Varsayılanlarını Ayarla ... veya Gelişmiş Ayarlar ... öğesini seçin .
  • Değişim 32-Bit Uygulamaları Etkinleştir True olarak.
  • Tıklayın Tamam .
  • Seç Set Uygulaması Havuz Varsayılanları ... ya ... Gelişmiş Ayarlar tekrar.
  • Değişim 32-bit uygulamaları etkinleştirme geri FALSE.
  • Tıklayın Tamam .

4

Web uygulamasını farklı bir "Uygulama Havuzu" kullanacak şekilde değiştirerek bu sorunu çözdüm.


4

Buraya daha sonra gelebilecek herkes için .... Benim için hiçbir şey işe yaramadı. Tüm toplantılarım iyiydi. Visual Studio Projelerimden birinde olmaması gereken bir uygulama yapılandırmam vardı. Bu nedenle, uygulama yapılandırma dosyanızın gerekli olduğundan emin olun.

Ekstra uygulama yapılandırmasını sildim ve işe yaradı.


Benim için düzelt. Benim App.config, .NET 4.5.1 uygulamamı 2.0 CLR'ye ayarlıyordu!
Jared Thirsk

4

Hedef derleme x64 Hedef Sunucu Barındırma IIS 64 Bit

Uygulama derlemesi 64-Bit işletim sistemini hedefliyorsa, IIS'yi barındıran 64-Bit sunucuda, web sitesini / web uygulamasını çalıştıran uygulama havuzundaki 32 bit etkinleştir uygulamasını false olarak ayarlayın.

görüntü açıklamasını buraya girin


2

Uygulama tarafından kullanılan uygulama havuzunu belirleyin ve 32 bit uygulamaları etkinleştir seçeneğini True olarak ayarlayarak özelliğini ayarlayın. Bu, uygulama havuzunun gelişmiş ayarları aracılığıyla yapılabilir.


2

32-bit veya 64-bit platform için uygulamalar oluştururken (Benim deneyimim Visual Studio 2010 ile), yürütülebilir dosya için doğru platformu ayarlamak için Configuration Manager'a güvenmeyin. CM'de uygulama için x86 seçilmiş olsa bile, proje özelliklerini kontrol edin (Oluşturma sekmesi): orada hala "Herhangi bir CPU" yazabilir. Ve 64 bitlik bir platformda çalıştırılabilir bir "Herhangi bir CPU" çalıştırırsanız, 64 bit modunda çalışır ve x86 platformu için oluşturulmuş beraberindeki DLL'lerinizi yüklemeyi reddeder.


1

Web.Config konsolunuzdaki System.Runtime bağımlılığınızı kaldırın, benim için çalıştı:

<dependentAssembly>
        <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
</dependentAssembly>

Benim için oldu System.Net.Http. Bunun için teşekkürler.
Snickbrack

1

İçin .NET Çekirdek , bir orada Visual Studio 2017 hata proje özellikleri Yapı sayfa yanlış platformu hedef göstermesine neden olabilir. Sorunun olduğunu keşfettikten sonra, geçici çözümler oldukça kolaydır. Hedefi başka bir değerle değiştirebilir ve ardından tekrar değiştirebilirsiniz.

Alternatif olarak, .csproj dosyasına bir çalışma zamanı tanımlayıcısı ekleyebilirsiniz. .Exe'nizin bir x86 yerel DLL dosyasını yükleyebilmesi için x86 olarak çalışmasına ihtiyacınız varsa, bu öğeyi a PropertyGroup:

<RuntimeIdentifier>win-x86</RuntimeIdentifier>

Bunu koymak için iyi bir yer, TargetFrameworkveya TargetFrameworksöğesinin hemen arkasındadır .


1

Kimsenin bundan bahsetmediğine şaşırdım, bu yüzden yukarıdaki yardımlardan hiçbiri (benim durumum) durumunda paylaşıyorum.

Olan şey, bir VBCSCompiler.exe örneğinin bir şekilde sıkışmış olması ve aslında yeni örneklerin yeni dosyaları doğru şekilde yazmasına izin vermek için dosya tanıtıcılarını serbest bırakmaması ve soruna neden olmasıydı. Bu, "bin" klasörünü silmeye çalıştığımda ve başka bir işlemin oradaki dosyaları kullandığından şikayet ettiğimde ortaya çıktı.

Kapalı VS, görev yöneticisi açıldı, tüm VBCSCompiler örneklerini aradı ve sonlandırdı ve bulunduğum yere geri dönmek için "bin" klasörünü sildi.

Referans: https://developercommunity.visualstudio.com/content/problem/117596/vbcscompilerexe-process-stays-runing-after-exiting.html


Çözümüm ayrıca tüm bin ve hata ayıklama dizinlerini silmek oldu.
gabnaim

0

Buraya daha sonra gelebilecek herkes için ...
Masaüstü çözümü için bir BadImageFormatExceptionistisna var .
Tüm projenin inşa seçenekleri iyiydi (tümü x86). Ancak çözümün Başlangıç ​​projesi başka bir proje (sınıf kitaplığı projesi) ile değiştirildi.

Başlangıç ​​projesini orijinal (.exe uygulama projesi) olarak değiştirmek benim durumumda bir çözümdü


0

Bu sorunla karşılaştığımda aşağıdakiler benim için çözdü:

Başka bir exe içinden OpenCV dll çağırıyordum, benim dll dosyam exe dosyamın klasöründe bulunan highgui, features2d vb. Gibi zaten gerekli olan opencv dll'leri içermiyordu. Tüm bunları exe projemin dizinine kopyaladım ve birden çalıştı.


0

"Dosya veya derleme 'örneği' veya bağımlılıklarından biri yüklenemedi. Yanlış biçime sahip bir program yüklenmeye çalışıldı" hatası genellikle yanlış bir uygulama havuzu yapılandırmasından kaynaklanır.

  1. Sitenizin şu anda çalışmakta olduğu AppPool'un "32-Bit Uygulamaları Etkinleştir" seçeneğinin Yanlış olarak ayarlandığından emin olun.
  2. Platformunuz için doğru sürümü kullandığınızdan emin olun.
  3. Bu hatayı bir web sitesinde alıyorsanız, uygulama havuzunuzun doğru modda çalışacak şekilde ayarlandığından emin olun (3.0 siteleri 64 bit modunda çalışmalıdır)
  4. Ayrıca, visual studio'daki bu montaja yapılan referansın, paketler klasöründeki doğru dosyaya işaret ettiğinden emin olmalısınız.
  5. 2.0 siteleri için GAC'de kurulu dll'nin doğru sürümüne sahip olduğunuzdan emin olun.
  6. Bu, WSODLibs'in web projesi ile yükseltilmesinden de kaynaklanabilir.
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.