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.

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).


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


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ą.


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


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.


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.


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

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.


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.


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.


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.


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


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.


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.