System.BadImageFormatException: Tidak dapat memuat file atau assembly (dari installutil.exe)

104

Saya mencoba menginstal layanan Windows menggunakan InstallUtil.exe dan mendapatkan pesan kesalahan

System.BadImageFormatException: Tidak dapat memuat file atau assembly ' {xxx.exe}' atau salah satu dependensinya. Upaya telah dilakukan untuk memuat program dengan format yang salah.

Apa yang memberi?


EDIT: (Not by OP) Pesan lengkap diekstrak dari dup mendapatkan lebih banyak hits [untuk googleability]:

C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319> InstallUtil.exe C: \ xxx.exe Microsoft (R) .NET Framework Instalasi utilitas Versi 4.0.30319.1 Hak Cipta (c) Microsoft Corporation. Seluruh hak cipta.

Pengecualian terjadi saat menginisialisasi penginstalan: System.BadImageFormatException: Tidak dapat memuat file atau assembly 'file: /// C: \ xxx.exe' atau salah satu dependensinya. Upaya telah dilakukan untuk memuat program dengan format yang salah ..

Epaga
sumber

Jawaban:

154

Beberapa detail lebih lanjut untuk kelengkapan jika itu membantu seseorang ...

Perhatikan bahwa alasan paling umum untuk pengecualian ini saat ini adalah mencoba memuat /platform:x86DLL khusus 32 bit ( ) ke dalam proses yang 64 bit atau sebaliknya (yaitu memuat /platform:x64DLL khusus 64 bit ( ) ke dalam proses yang 32 bit). Jika Anda platformnon-spesifik ( /platform:AnyCpu), ini tidak akan muncul (dengan asumsi tidak ada dependensi yang direferensikan dengan bitness yang salah).

Dengan kata lain, menjalankan:

% windir% \ Microsoft.NET \ Framework \ v2.0.50727 \ installutil.exe

atau:

% windir% \ Microsoft.NET \ Framework 64 \ v2.0.50727 \ installutil.exe

tidak akan berfungsi (gantikan versi kerangka kerja lainnya: v1.1.4322(hanya 32-bit, jadi masalah ini tidak muncul) dan v4.0.30319seperti yang diinginkan di atas).

Jelas, seperti yang tercakup dalam jawaban lain, seseorang juga akan membutuhkan nomor versi .NET dari yang installutilAnda jalankan menjadi> = (lebih disukai =) dari file EXE / DLL tempat Anda menjalankan penginstal.

Terakhir, perhatikan bahwa di Visual Studio 2010, perkakas akan secara default menghasilkan binari x86 ( bukan CPU apa pun seperti sebelumnya ).

Detail lengkap System.BadImageFormatException (mengatakan satu-satunya penyebab adalah ketidakcocokan bitted sebenarnya adalah penyederhanaan yang berlebihan!).

Alasan lain untuk penginstal di BadImageFormatExceptionbawah x64 adalah bahwa di Visual Studio 2010, jenis default .vdprojInstal Proyek menghasilkan InstallUtilLibshim 32-bit , bahkan pada sistem x64 (Cari "tindakan kustom terkelola 64-bit melempar pengecualian System.BadImageFormatException" pada halaman).

Ruben Bartelink
sumber
Saya memiliki masalah yang sama, ketika saya mulai men-debug sesuai dengan apa yang Anda katakan di atas, saya menemukan bahwa Platform: disetel sebagai x86. Ketika saya mengubahnya ke Any CPU, itu berhasil :)
Atta H.
Saya memiliki penginstal windows saya dengan tindakan Kustom. Setup saya perlu dijalankan pada sistem x64, jadi properti Tindakan kustom harus memeriksa opsi "Run64Bit" dengan benar. Itu memecahkan masalah saya.
Hagen
16

Pastikan Framework terbaru (yang Anda gunakan untuk mengompilasi aplikasi Anda) adalah yang pertama di PATH. Itu memecahkan masalah saya. (Ditemukan di forum )

Epaga
sumber
Tautan itu sepertinya hilang. Tidak terlalu mengejutkan. 6 tahun yang lalu.
Al Lelopath
9

Saya pikir Anda menggunakan alat versi 64-bit untuk menginstal aplikasi 32-bit. Saya juga menghadapi masalah ini hari ini dan menggunakan jalur Kerangka ini untuk memenuhi.

C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319

dan seharusnya menginstal aplikasi 32-bit Anda dengan baik.

Sachin Kalia
sumber
Itu skenario bagi saya. Jawaban yang sangat membantu.
Simos Fasouliotis
Setidaknya tautkan jawaban asli: stackoverflow.com/revisions/5229405/1
crusy
8

Kuncinya adalah menyetel setelan prosesor yang cocok untuk proyek yang ada di dua tempat.

masukkan deskripsi gambar di sini

Dan juga pastikan pengaturan arsitekturnya sama di menu Test >> Test Settings >> Default Processor Architecture >> seperti yang ditunjukkan di bawah ini.

masukkan deskripsi gambar di sini

Ini untuk VS2013 tetapi mungkin sama untuk versi lain juga.

Pembaruan - Untuk VS2019:

masukkan deskripsi gambar di sini

zar
sumber
Ini adalah cara yang benar untuk memperbaiki kesalahan ini. Artinya, jika Anda tidak ingin dipusingkan dengan kemungkinan ratusan file csproj.
Bizhan
6

Oke, ini masalah yang saya alami, dan, yang memperbaikinya, tampaknya sangat relevan dengan hal di atas.

Saya menggunakan Visual Studio 2010 Express. Saya menulis layanan pengujian yang tidak benar-benar melakukan apa pun. Itu hanya latihan untuk hal yang sebenarnya nanti.

Saya menulis layanan dan mencoba menginstalnya menggunakan installutil.exedan mendapatkan kesalahan berikut:

System.BadImageFormatException: Tidak dapat memuat file atau assembly '{filename.exe}' atau salah satu dependensinya. Upaya telah dilakukan untuk memuat program dengan format yang salah.

Sejauh ini sama dengan penulis aslinya.

Pengamatan Ruben di atas tentang 32 bit output Visual Studio 2010 menjadi penyelamat disini.

Saya menggunakan versi 64-bit installutil.exedan cukup yakin, output dari Visual Studio 2010 build adalah 32-bit. Hanya untuk menambahkan sedikit nilai ekstra di sini, Anda dapat menemukan versi 32-bit dari kerangka .NET terbaru dan yang terkait installutil.exedi folder C: \ Windows \ Microsoft.NET \ framework . Menggunakan versi ini installutil.exememperbaiki masalah saya; layanan dipasang tanpa hambatan!

Saya harap ini membantu orang lain di luar sana.

James Crowther
sumber
Saya tidak tahu apa yang Anda maksud dengan versi 32-bit tetapi saya mencoba yang satu di sini dan itu tidak berhasil baik C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727
user2568374
3

Setelah mencoba semua solusi yang disebutkan, saya menemukan PlatformTargetentah bagaimana ditambahkan ke AnyCPUkonfigurasi dalam proyek saya .csproj.

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <PlatformTarget>x64</PlatformTarget>
</PropertyGroup>

Menghapus garis berhasil untuk saya.

SohamC
sumber
Dalam kasus saya, di mana saya menginginkan build 64 bit, salah satu node PropertyGroup tidak memiliki node <PlatformTarget> x64 </PlatformTarget>, jadi mungkin itu default ke 32 bit dan menimbulkan kesalahan format gambar yang buruk. Setelah saya menambahkan node yang hilang ini ke grup properti, kesalahan tersebut menghilang.
Tom Regan
Mencoba solusi ini menyebabkan masalah lain bagi saya, yaitu appSettings app.config tidak dimuat selama runtime meskipun file konfigurasi ada di direktori keluaran . Namun, setelah mencoba pendekatan zar ( Processor Architecture for AnyCPU Projects) semuanya mulai bekerja kembali.
Bizhan
1

Saya mengalami masalah ini dengan Proyek WinForms menggunakan VS 2015. Solusi saya adalah:

  1. klik kanan Proyek
  2. pilih properti
  3. centang "Lebih suka 32-bit"
  4. Target platform: Semua CPU
Michael Staples
sumber
0

Saya memiliki masalah yang sama. Saya menggunakan perintah standar untuk eksekusi. Itu memanggil X64 ro dijalankan terhadap tes X86. Saya perlu menentukan X86 dan bukan versi X64 dari nunit-runner.

dermot kirk
sumber
0

Meringkas, Build dan Project \ Build \ Platform harus disetel ke x64 agar berhasil menginstal layanan 64 bit pada sistem 64 bit.

Daniel D
sumber
0

Masalah saya berbeda. Ini terjadi setelah komputer windows 7 saya mati secara tidak terduga. Saya melakukan solusi bersih dan berjalan seperti yang diharapkan.

GregN
sumber
0

Dalam kasus memiliki pesan ini dalam pengujian langsung , tetapi tidak dalam pengujian unit , itu karena rakitan yang dipilih disalin dengan cepat $(SolutionDir)\.vs\$(SolutionName)\lut\0\0\x64\Debug\. Tetapi kadang-kadang beberapa rakitan tidak dapat dipilih , misalnya, VC ++ dll dalam kasus interop c ++ / c # proyek.

Pasca-build xcopytidak akan memperbaiki masalah, karena file yang disalin akan dihapus oleh mesin uji langsung.

Satu-satunya solusi hingga saat ini (28 Desember 2018), adalah menghindari pengujian Langsung, dan melakukan semuanya dalam pengujian unit dengan atribut yang [TestCategory("SkipWhenLiveUnitTesting")]diterapkan ke kelas pengujian atau metode pengujian.

Bug ini terlihat di Visual Studio 2017 hingga 15.9.4, dan perlu ditangani oleh tim Visual Studio.

Soleil - Mathieu Prévot
sumber
0

Target build x64 Target Server Hosting IIS 64 Bit

Klik kanan appPool hosting yang menjalankan situs web / aplikasi web dan atur aktifkan 32 bit application = false.

masukkan deskripsi gambar di sini

VK_217
sumber
0

Saya menghadapi masalah ini hari ini. Dalam kasus saya, target platform aplikasi saya (memiliki referensi ke 64-bit dll) disetel ke AnyCPUtetapi Prefer 32-bit kotak centang di bawah bagian target platform dicentang secara default. Ini adalah masalah dan bekerja dengan baik setelah Prefer 32-bitopsi un-check .

Abu
sumber
0

Kami menemukan solusi berbeda untuk masalah dengan gejala yang sama:

Kami melihat kesalahan ini ketika memperbarui proyek dari .net 4.7.1 ke 4.7.2.

Masalahnya adalah meskipun kami tidak mereferensikan System.Net.Http lagi dalam proyek, itu terdaftar di bagian dependentAssembily dari web.config kami. Menghapus ini dan referensi assembly yang tidak digunakan lainnya dari web.config memecahkan masalah.

Logan
sumber
0

Masalahnya adalah bahwa setiap System.BadImageFormatException: Could not load file or assemblytermasuk yang tidak terkait installutil.exesama sekali mengarah ke utas ini.

  1. Jika masalah Anda terkait dengan WindowsBaseatau PresentationFramework dll dan Anda menginstal penganalisis, pastikan untuk menginstalnya untuk semua proyek dalam solusi Anda atau tidak satupun dari mereka.

    masukkan deskripsi gambar di sini

  2. Referensikan seluruh kerangka kerja dalam .csprojfile perpustakaan Anda, bukan hanya keduanya dlls:

    <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
    
      <PropertyGroup>
        <OutputType>Library</OutputType>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        <RazorLangVersion>3.0</RazorLangVersion>
        <UseWpf>True</UseWpf>
      </PropertyGroup>
  3. Hapus bindan objkotor, bersihkan larutan dan bangun kembali.

rvnlord
sumber