System.BadImageFormatException: nie można załadować pliku lub zestawu (z installutil.exe)

104

Próbuję zainstalować usługę systemu Windows przy użyciu programu InstallUtil.exe i pojawia się komunikat o błędzie

System.BadImageFormatException: nie można załadować pliku lub zestawu „ {xxx.exe}” lub jednej z jego zależności. Podjęto próbę załadowania programu o nieprawidłowym formacie.

Co daje?


EDYCJA: (nie przez OP) Pełna wiadomość wyodrębniona z dup, uzyskując o wiele więcej trafień [dla Googleability]:

C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319> InstallUtil.exe C: \ xxx.exe Narzędzie instalacyjne Microsoft (R) .NET Framework Wersja 4.0.30319.1 Copyright (c) Microsoft Corporation. Wszelkie prawa zastrzeżone.

Wystąpił wyjątek podczas inicjowania instalacji: System.BadImageFormatException: nie można załadować pliku lub zestawu „file: /// C: \ xxx.exe” lub jednej z jego zależności. Podjęto próbę załadowania programu o nieprawidłowym formacie.

Epaga
źródło

Odpowiedzi:

154

Więcej szczegółów dotyczących kompletności na wypadek, gdyby komuś to pomogło ...

Należy zauważyć, że obecnie najczęstszą przyczyną tego wyjątku jest próba załadowania 32-bitowej ( /platform:x86) biblioteki DLL do procesu, który jest 64-bitowy lub odwrotnie (tj. Załadowanie 64-bitowej ( /platform:x64) biblioteki DLL do procesu, który jest 32-bitowy). Jeśli twoja platformjest niespecyficzna ( /platform:AnyCpu), to się nie pojawi (zakładając, że żadne z zależności, do których istnieją odwołania, nie mają złej bitowości).

Innymi słowy, bieganie:

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

lub:

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

nie zadziała (zastąpi w innych wersjach frameworka: v1.1.4322(tylko 32-bitowe, więc ten problem nie występuje) i v4.0.30319zgodnie z życzeniem w powyższym).

Oczywiście, jak opisano w drugiej odpowiedzi, będzie również potrzebny numer wersji .NET używanego programu installutil, aby był> = (najlepiej =) taki, jak plik EXE / DLL, którego uruchamiasz instalator.

Na koniec należy zauważyć, że w programie Visual Studio 2010 narzędzia domyślnie generują pliki binarne x86 ( zamiast dowolnego procesora, jak poprzednio ).

Pełne szczegóły System.BadImageFormatException (stwierdzenie, że jedyną przyczyną jest niedopasowana bity, jest naprawdę rażącym uproszczeniem!).

Innym powodem BadImageFormatExceptionzastosowania instalatora w wersji x64 jest to, że w programie Visual Studio 2010 domyślny .vdprojtyp projektu instalacji generuje 32-bitową InstallUtilLibpodkładkę, nawet w systemie x64 (Wyszukaj „64-bitowe zarządzane akcje niestandardowe zgłaszają wyjątek System.BadImageFormatException” na Strona).

Ruben Bartelink
źródło
Miałem ten sam problem, kiedy zacząłem debugować zgodnie z tym, co powiedziałeś powyżej, stwierdziłem, że Platforma: została ustawiona jako x86. Kiedy zmieniłem go na Any CPU, zadziałało :)
Atta H.
Mam instalator Windows z akcjami niestandardowymi. Moja konfiguracja musi działać w systemie x64, więc właściwości akcji niestandardowych muszą zaznaczyć opcję „Run64Bit” jako true. To rozwiązało mój problem.
Hagen
16

Upewnij się, że najnowszy Framework (ten, z którym skompilowałeś swoją aplikację) jest pierwszy w PATH. To rozwiązało problem. (Znalezione na forum )

Epaga
źródło
Wydaje się, że ten link zniknął. Nie jest to jednak zaskakujące. 6 lat temu.
Al Lelopath
9

Myślę, że używasz 64-bitowej wersji narzędzia do instalowania aplikacji 32-bitowej. Zmierzyłem się również z tym problemem dzisiaj i skorzystałem z tej ścieżki Framework, aby go zaspokoić.

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

i powinien dobrze zainstalować twoją aplikację 32-bitową.

Sachin Kalia
źródło
To był scenariusz dla mnie. Bardzo pomocna odpowiedź.
Simos Fasouliotis
Przynajmniej link do oryginalnej odpowiedzi: stackoverflow.com/revisions/5229405/1
crusy
8

Kluczem jest ustawienie dopasowania ustawień procesora dla projektu, które znajdują się w dwóch miejscach.

wprowadź opis obrazu tutaj

Upewnij się również, że ustawienia architektury są takie same w menu Test >> Ustawienia testowe >> Domyślna architektura procesora >>, jak pokazano poniżej.

wprowadź opis obrazu tutaj

To jest dla VS2013, ale może to samo dla innych wersji.

Aktualizacja - dla VS2019:

wprowadź opis obrazu tutaj

zar
źródło
To jest właściwy sposób naprawienia tego błędu. To znaczy, jeśli nie chcesz bawić się prawdopodobnie setkami plików csproj.
Bizhan
6

OK, to jest problem, który miałem i to, co go naprawiło, wydaje się być bardzo istotne dla powyższego.

Używam programu Visual Studio 2010 Express. Napisałem serwis testowy, który tak naprawdę nic nie zrobił. To była tylko praktyka później.

Napisałem usługę i próbowałem ją zainstalować za pomocą installutil.exei otrzymałem następujący błąd:

System.BadImageFormatException: nie można załadować pliku lub zestawu „{filename.exe}” lub jednej z jego zależności. Podjęto próbę załadowania programu o nieprawidłowym formacie.

Jak dotąd to samo, co pierwotny autor.

Zbawicielem była tutaj powyższa obserwacja Rubena dotycząca 32-bitowego wyjścia programu Visual Studio 2010.

Użyłem 64-bitowej wersji programu installutil.exei oczywiście, wynik kompilacji Visual Studio 2010 był 32-bitowy. Aby dodać trochę dodatkowej wartości, możesz znaleźć 32-bitową wersję najnowszej platformy .NET i powiązaną z nią installutil.exew folderze C: \ Windows \ Microsoft.NET \ framework . Korzystanie z tej wersji installutil.exerozwiązało mój problem; usługa zainstalowana bez żadnych problemów!

Mam nadzieję, że to pomoże komuś innemu.

James Crowther
źródło
Nie wiem, co masz na myśli przez wersję 32-bitową, ale wypróbowałem tę tutaj i to też nie działa C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727
user2568374
3

Po wypróbowaniu wszystkich wymienionych rozwiązań znalazłem w PlatformTargetjakiś sposób dodane do AnyCPUkonfiguracji w moim projekcie .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>

Usunięcie linki zadziałało dla mnie.

SohamC
źródło
W moim przypadku, gdy chcę kompilację 64-bitową, w jednym z węzłów PropertyGroup brakowało węzła <PlatformTarget> x64 </PlatformTarget>, więc przypuszczalnie był to domyślny 32-bitowy i wyrzucający zły format obrazu. Po dodaniu tego brakującego węzła do grupy właściwości błąd zniknął.
Tom Regan,
Wypróbowanie tego rozwiązania doprowadziło mnie do innego problemu, którym było to, że appSettings app.config nie były ładowane podczas działania, mimo że plik konfiguracyjny znajdował się w katalogu wyjściowym . jednak po wypróbowaniu podejścia Zara ( Processor Architecture for AnyCPU Projects) wszystko zaczyna działać ponownie.
Bizhan
1

Miałem ten problem z projektem WinForms używającym VS 2015. Moje rozwiązanie było:

  1. kliknij prawym przyciskiem myszy projekt
  2. wybierz właściwości
  3. zaznacz „Preferuj wersję 32-bitową”
  4. Cel platformy: dowolny procesor
Michael Staples
źródło
0

Miałem ten sam problem. Używam standardowego polecenia do wykonania. To było wywołanie X64 ro run przeciwko testom X86. Musiałem określić X86, a nie wersję X64 nunit-runner.

dermot kirk
źródło
0

Podsumowując, zarówno Build, jak i Project \ Build \ Platform muszą być ustawione na x64, aby pomyślnie zainstalować usługę 64-bitową w systemie 64-bitowym.

Daniel D.
źródło
0

Mój problem był inny. Stało się to po nieoczekiwanym zamknięciu mojego komputera z systemem Windows 7. Wykonałem czysty roztwór i działał zgodnie z oczekiwaniami.

GregN
źródło
0

W przypadku wystąpienia tego komunikatu w testach na żywo , ale nie w testach jednostkowych , dzieje się tak, ponieważ wybrane zestawy są kopiowane w locie do $(SolutionDir)\.vs\$(SolutionName)\lut\0\0\x64\Debug\. Ale czasami nie można wybrać kilku zestawów , np. Biblioteki DLL VC ++ w przypadku projektów międzyoperacyjnych c ++ / c #.

Post-build xcopynie naprawi problemu, ponieważ skopiowany plik zostanie usunięty przez silnik testu na żywo.

Jedynym dotychczasowym obejściem (28 grudnia 2018 r.) Jest unikanie testów na żywo i wykonywanie wszystkiego w testach jednostkowych z atrybutem [TestCategory("SkipWhenLiveUnitTesting")]zastosowanym do klasy testowej lub metody testowej.

Ten błąd jest widoczny w dowolnym programie Visual Studio 2017 do 15.9.4 i musi zostać rozwiązany przez zespół programu Visual Studio.

Soleil - Mathieu Prévot
źródło
0

Kompilacja docelowa x64 Hosting serwera docelowego IIS 64-bitowy

Kliknij prawym przyciskiem myszy appPool hosting obsługujący witrynę internetową / aplikację internetową i ustaw opcję Enable 32-bit application = false.

wprowadź opis obrazu tutaj

VK_217
źródło
0

Dzisiaj miałem do czynienia z tym problemem. W moim przypadku docelowa platforma mojej aplikacji (miała odniesienie do 64-bitowej biblioteki dll) była ustawiona na, AnyCPUale Prefer 32-bit pole wyboru w sekcji docelowej platformy było domyślnie zaznaczone. To był problem i działał dobrze po usunięciu zaznaczenia Prefer 32-bitopcji.

popiół
źródło
0

Znaleźliśmy inne rozwiązanie problemu z tym samym objawem:

Widzieliśmy ten błąd, kiedy zaktualizowaliśmy projekt z .net 4.7.1 do 4.7.2.

Problem polegał na tym, że chociaż nie odnosiliśmy się już do System.Net.Http w projekcie, został on wymieniony w sekcji dependentAssembily naszego web.config. Usunięcie tego i wszelkich innych nieużywanych odwołań do zestawów z pliku web.config rozwiązało problem.

Logan
źródło
0

Problem w tym, że wszystkie, System.BadImageFormatException: Could not load file or assemblyłącznie z tymi, z którymi w ogóle nie są skojarzone, installutil.exewskazują na ten wątek.

  1. Jeśli problem jest związany z bibliotekami DLL WindowsBaselub PresentationFrameworki masz zainstalowane analizatory, upewnij się, że są one zainstalowane dla wszystkich projektów w rozwiązaniu lub dla żadnego z nich.

    wprowadź opis obrazu tutaj

  2. Odwołaj się do całej struktury w .csprojpliku swojej biblioteki, a nie tylko do dwóch dlls:

    <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
    
      <PropertyGroup>
        <OutputType>Library</OutputType>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        <RazorLangVersion>3.0</RazorLangVersion>
        <UseWpf>True</UseWpf>
      </PropertyGroup>
  3. Usuń bini objskieruj, wyczyść roztwór i odbuduj.

rvnlord
źródło