System.BadImageFormatException: Datei oder Assembly konnte nicht geladen werden (von installutil.exe)

104

Ich versuche, einen Windows-Dienst mit InstallUtil.exe zu installieren, und erhalte die Fehlermeldung

System.BadImageFormatException: Datei oder Assembly ' {xxx.exe}' oder eine ihrer Abhängigkeiten konnte nicht geladen werden . Es wurde versucht, ein Programm mit einem falschen Format zu laden.

Was gibt?


BEARBEITEN: (Nicht von OP) Vollständige Nachricht aus dup extrahiert, die viel mehr Treffer erhält [für googleability]:

C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319> InstallUtil.exe C: \ xxx.exe Microsoft (R) .NET Framework-Installationsdienstprogramm Version 4.0.30319.1 Copyright (c) Microsoft Corporation. Alle Rechte vorbehalten.

Beim Initialisieren der Installation ist eine Ausnahme aufgetreten: System.BadImageFormatException: Datei oder Assembly 'file: /// C: \ xxx.exe' oder eine ihrer Abhängigkeiten konnte nicht geladen werden. Es wurde versucht, ein Programm mit einem falschen Format zu laden.

Epaga
quelle

Antworten:

154

Weitere Details der Vollständigkeit halber, falls es jemandem hilft ...

Beachten Sie, dass der häufigste Grund für diese Ausnahme heutzutage der Versuch ist, eine 32-Bit-spezifische ( /platform:x86) DLL in einen 64-Bit-Prozess zu laden oder umgekehrt (dh eine 64-Bit-spezifische ( /platform:x64) DLL in einen Prozess zu laden ) 32 Bit). Wenn Ihre platformnicht spezifisch ist ( /platform:AnyCpu), tritt dies nicht auf (vorausgesetzt, keine referenzierten Abhängigkeiten haben die falsche Bitigkeit).

Mit anderen Worten: Laufen:

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

oder:

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

funktioniert nicht (in anderen Framework-Versionen ersetzen: v1.1.4322(nur 32-Bit, damit dieses Problem nicht auftritt) und v4.0.30319wie oben gewünscht).

Wie in der anderen Antwort beschrieben, muss die .NET-Versionsnummer der von installutilIhnen ausgeführten Datei natürlich > = (vorzugsweise =) der EXE / DLL-Datei sein, deren Installationsprogramm Sie ausführen.

Beachten Sie schließlich, dass in Visual Studio 2010 standardmäßig x86-Binärdateien generiert werden ( und nicht wie zuvor eine beliebige CPU ).

Vollständige Details zu System.BadImageFormatException (die einzige Ursache ist eine nicht übereinstimmende Bittedness, was wirklich eine grobe Vereinfachung darstellt!).

Ein weiterer Grund für BadImageFormatExceptionein x64- Installationsprogramm ist, dass in Visual Studio 2010 der Standardtyp " .vdprojProjekt installieren" auch auf einem x64-System einen 32-Bit- InstallUtilLibShim generiert (Suche nach "64-Bit-verwalteten benutzerdefinierten Aktionen lösen eine System.BadImageFormatException-Ausnahme aus" Die Seite).

Ruben Bartelink
quelle
Ich hatte das gleiche Problem, als ich mit dem Debuggen gemäß dem oben Gesagten begann, stellte ich fest, dass Platform: auf x86 eingestellt war. Als ich es in eine beliebige CPU geändert habe, hat es funktioniert :)
Atta H.
Ich habe mein Windows-Installationsprogramm mit benutzerdefinierten Aktionen. Mein Setup muss auf einem x64-System ausgeführt werden, daher müssen die Eigenschaften für benutzerdefinierte Aktionen die Option "Run64Bit" in true aktivieren. Es hat mein Problem gelöst.
Hagen,
16

Stellen Sie sicher, dass das neueste Framework (das, mit dem Sie Ihre App kompiliert haben) das erste im PATH ist. Das hat das Problem für mich gelöst. (Gefunden in einem Forum )

Epaga
quelle
Dieser Link scheint weg zu sein. Nicht allzu überraschend. vor 6 Jahren.
Al Lelopath
9

Ich denke, Sie verwenden die 64-Bit-Version des Tools, um eine 32-Bit-Anwendung zu installieren. Ich habe mich heute auch mit diesem Problem befasst und diesen Framework-Pfad verwendet, um Abhilfe zu schaffen.

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

und es sollte Ihre 32-Bit-Anwendung gut installieren.

Sachin Kalia
quelle
Das war das Szenario für mich. Sehr hilfreiche Antwort.
Simos Fasouliotis
Verknüpfen Sie mindestens die ursprüngliche Antwort: stackoverflow.com/revisions/5229405/1
Crusy
8

Der Schlüssel besteht darin, Übereinstimmungsprozessoreinstellungen für das Projekt festzulegen, die sich an zwei Stellen befinden.

Geben Sie hier die Bildbeschreibung ein

Stellen Sie außerdem sicher, dass die Architektureinstellungen im Menü Test >> Testeinstellungen >> Standardprozessorarchitektur >> identisch sind (siehe unten).

Geben Sie hier die Bildbeschreibung ein

Dies gilt für VS2013, möglicherweise jedoch auch für andere Versionen.

Update - Für VS2019:

Geben Sie hier die Bildbeschreibung ein

zar
quelle
Dies ist der richtige Weg, um diesen Fehler zu beheben. Das heißt, wenn Sie nicht mit möglicherweise Hunderten von csproj-Dateien herumspielen möchten.
Bizhan
6

OK, das ist das Problem, das ich hatte, und was es behoben hat, scheint für das oben Gesagte sehr relevant zu sein.

Ich verwende Visual Studio 2010 Express. Ich habe einen Testdienst geschrieben, der eigentlich nichts getan hat. Es war nur Übung für die reale Sache später.

Ich habe den Dienst geschrieben und versucht, ihn mit zu installieren, installutil.exeund habe den folgenden Fehler erhalten:

System.BadImageFormatException: Datei oder Assembly '{filename.exe}' oder eine ihrer Abhängigkeiten konnte nicht geladen werden. Es wurde versucht, ein Programm mit einem falschen Format zu laden.

Soweit das gleiche wie der ursprüngliche Autor.

Rubens obige Beobachtung über die 32-Bit-Ausgabe von Visual Studio 2010 war hier der Retter.

Ich habe die 64-Bit-Version von verwendet installutil.exeund die Ausgabe des Visual Studio 2010-Builds war 32-Bit. Um hier einen kleinen Mehrwert zu erzielen, finden Sie die 32-Bit-Version des neuesten .NET-Frameworks und das zugehörige installutil.exeim Ordner C: \ Windows \ Microsoft.NET \ Framework . Mit dieser Version wurde installutil.exemein Problem behoben; Der Service ist reibungslos installiert!

Ich hoffe, das hilft jemand anderem da draußen.

James Crowther
quelle
Ich weiß nicht, was Sie mit der 32-Bit-Version meinen, aber ich habe die hier ausprobiert und es hat auch nicht funktioniert C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727
user2568374
3

Nachdem ich alle genannten Lösungen ausprobiert hatte, fand ich die PlatformTargetirgendwie zur AnyCPUKonfiguration hinzugefügte .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>

Das Entfernen der Leitung hat bei mir funktioniert.

SohamC
quelle
In meinem Fall, in dem ich einen 64-Bit-Build möchte, fehlte einem der PropertyGroup-Knoten der Knoten <PlatformTarget> x64 </ PlatformTarget>, sodass vermutlich standardmäßig 32 Bit verwendet wurde und der Fehler beim fehlerhaften Bildformat ausgegeben wurde. Nachdem ich diesen fehlenden Knoten zur Eigenschaftsgruppe hinzugefügt hatte, verschwand der Fehler.
Tom Regan
Der Versuch dieser Lösung führte für mich zu einem weiteren Problem : Die appSettings von app.config wurden zur Laufzeit nicht geladen, obwohl die Konfigurationsdatei im Ausgabeverzeichnis vorhanden war . Nachdem Sie jedoch zars Ansatz ( Processor Architecture for AnyCPU Projects) ausprobiert haben, funktioniert alles wieder.
Bizhan
1

Ich hatte dieses Problem mit einem WinForms-Projekt mit VS 2015. Meine Lösung war:

  1. Klicken Sie mit der rechten Maustaste auf das Projekt
  2. Eigenschaften auswählen
  3. Aktivieren Sie "32-Bit bevorzugen".
  4. Plattformziel: Beliebige CPU
Michael Staples
quelle
0

Ich hatte das gleiche Problem. Ich benutze den Standardbefehl zur Ausführung. Es wurde der X64 Ro-Lauf gegen X86-Tests aufgerufen. Ich musste den X86 und nicht die X64-Version des Nunit-Runners angeben.

dermot kirk
quelle
0

Zusammenfassend muss sowohl Build als auch Project \ Build \ Platform auf x64 festgelegt werden, um den 64-Bit-Dienst erfolgreich auf einem 64-Bit-System zu installieren.

Daniel D.
quelle
0

Mein Problem war anders. Dies geschah nach einem unerwarteten Herunterfahren meines Windows 7-Computers. Ich habe eine saubere Lösung durchgeführt und sie lief wie erwartet.

GregN
quelle
0

Wenn diese Meldung in Live-Tests , jedoch nicht in Komponententests angezeigt wird , werden ausgewählte Assemblys im laufenden Betrieb nach kopiert $(SolutionDir)\.vs\$(SolutionName)\lut\0\0\x64\Debug\. Manchmal können jedoch nur wenige Assemblys nicht ausgewählt werden , z. B. VC ++ - DLLs bei Interop-C ++ / C # -Projekten.

Nach dem Erstellen xcopywird das Problem nicht behoben, da die kopierte Datei von der Live-Test-Engine gelöscht wird.

Die einzige bisherige Problemumgehung (28. Dezember 2018) besteht darin, Live-Tests zu vermeiden und alles in Komponententests mit dem Attribut durchzuführen, das [TestCategory("SkipWhenLiveUnitTesting")]auf die Testklasse oder die Testmethode angewendet wird.

Dieser Fehler tritt in jedem Visual Studio 2017 bis 15.9.4 auf und muss vom Visual Studio-Team behoben werden.

Soleil - Mathieu Prévot
quelle
0

Zielerstellung x64 Zielserver Hosting IIS 64 Bit

Klicken Sie mit der rechten Maustaste auf appPool-Hosting, auf dem die Website / Webanwendung ausgeführt wird, und setzen Sie die 32-Bit-Aktivierungsanwendung auf false.

Geben Sie hier die Bildbeschreibung ein

VK_217
quelle
0

Ich habe mich heute diesem Problem gestellt. In meinem Fall wurde das Plattformziel meiner Anwendung (mit einem Verweis auf eine 64-Bit-DLL) festgelegt, AnyCPUaber das Prefer 32-bit Kontrollkästchen im Abschnitt Plattformziel wurde standardmäßig aktiviert. Dies war das Problem und funktionierte einwandfrei, nachdem die Prefer 32-bitOption deaktiviert wurde .

Asche
quelle
0

Wir haben eine andere Lösung für ein Problem mit demselben Symptom gefunden:

Wir haben diesen Fehler gesehen, als wir das Projekt von .net 4.7.1 auf 4.7.2 aktualisiert haben.

Das Problem war, dass System.Net.Http zwar nicht mehr im Projekt referenziert wurde, es jedoch im Abschnitt "DependableAssembily" unserer web.config aufgeführt war. Das Entfernen dieser und anderer nicht verwendeter Assemblyreferenzen aus der web.config löste das Problem.

Logan
quelle
0

Das Problem ist, dass alle, System.BadImageFormatException: Could not load file or assemblyeinschließlich derjenigen, die überhaupt nicht zugeordnet sind, installutil.exeauf genau diesen Thread verweisen.

  1. Wenn Ihr Problem mit WindowsBaseoder PresentationFramework DLLs zusammenhängt und Sie Analysatoren installiert haben, stellen Sie sicher, dass diese entweder für alle Projekte in Ihrer Lösung oder für keines von ihnen installiert sind.

    Geben Sie hier die Bildbeschreibung ein

  2. Verweisen Sie auf das gesamte Framework in der .csprojDatei Ihrer Bibliothek und nicht nur auf die beiden dlls:

    <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
    
      <PropertyGroup>
        <OutputType>Library</OutputType>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        <RazorLangVersion>3.0</RazorLangVersion>
        <UseWpf>True</UseWpf>
      </PropertyGroup>
  3. Entfernen binund objdirs, saubere Lösung und wieder aufbauen.

rvnlord
quelle