„Podjęto próbę załadowania programu o niepoprawnym formacie”, nawet jeśli platformy są takie same


461

Wywołuję funkcje z 32-bitowej niezarządzanej biblioteki DLL w systemie 64-bitowym. Dostaję to:

BadImageFormatException: Podjęto próbę załadowania programu o niepoprawnym formacie. (Wyjątek od HRESULT: 0x8007000B)

Na początku moje projekty były ustawione na platformę Any CPU, więc zmieniłem je oba na x86, ale ten błąd nadal występuje. To naprawdę jedyna poprawka, jaką znam na to.

Biblioteki DLL nie są uszkodzone ani nic, ponieważ mogę ich używać z innymi programami (do których nie mam źródła). Pomyślałem, że może nie chodziło o znalezienie zależności, ale sprawdziłem i wszyscy tam są. Plus, czy to nie rzuciłoby DllNotFoundExceptionw tym przypadku?

Co jeszcze mogę zrobić? I zanim powiesz „Zamiast tego użyj 64-bitowej niezarządzanej biblioteki DLL”, zwróć uwagę, że nie ma takiej. ;)


1
Jakie projekty zmieniłeś na x86? A jak je wykonać, gdy otrzymasz wyjątek, za pomocą debugera lub ręcznie? Jeśli to drugie, czy zauważyłeś, że po zmianie na x86 masz nowy folder w katalogu bin \? Zasadniczo jest to teraz bin \ x86 \ Debugowanie plików.
Lasse V. Karlsen

Czy możesz sprawdzić, czy plik wykonywalny działa w trybie 32-bitowym (* 32 w menedżerze procesów)?
JP Alioto,

@Lasse V. Karlsen: Tak, usunąłem bit x86 ze ścieżki wyjściowej, kiedy zmieniałem platformę w każdym projekcie. Mój pierwszy projekt to biblioteka DLL, która otacza funkcje w niezarządzanej bibliotece DLL. Drugi projekt to plik wykonywalny, który używa opakowania w pierwszej bibliotece DLL. Oba są ustawione na x86.
David Brown

@JP: W rzeczywistości menedżer procesów nie pokazuje, że działa jako proces 32-bitowy. Dlaczego?
David Brown

Odpowiedzi:


531

Jeśli spróbujesz uruchomić 32-bitowe aplikacje na IIS 7 (i / lub 64-bitowym komputerze z systemem operacyjnym), pojawi się ten sam błąd. Tak więc w IIS 7 kliknij prawym przyciskiem myszy pulę aplikacji i przejdź do „ustawień zaawansowanych” i zmień „Włącz aplikacje 32-bitowe” na „PRAWDA”.

Uruchom ponownie witrynę i powinna działać.

wprowadź opis zdjęcia tutaj


1
Och, moje dni łowiłem ryby, instalując dodatkowe komponenty IIS, kiedy to była odpowiedź ... Czy ktoś może zasugerować, że wybór tej opcji jest wadą?
notidaho

3
Oto dobra dyskusja na temat wydajności w tym zakresie: stackoverflow.com/questions/507820/...
Ben Power

Mam problem z SharpSvn i to nie pomaga. :( Coś jest bardzo nie tak z tym zestawem, mówię ci ...
user2173353

4
Ta odpowiedź jest dla mnie wtf, ponieważ pytanie w ogóle nie wspomina o IIS!
kristianp,

129

W jakiś sposób pole wyboru Kompilacja w menedżerze konfiguracji zostało odznaczone dla mojego pliku wykonywalnego, więc nadal działało ze starą kompilacją Any CPU. Po tym, jak to naprawiłem, Visual Studio narzekało, że nie może debugować zestawu, ale zostało to naprawione przy ponownym uruchomieniu.


Wielkie dzięki. To też mnie dopadło. Sprawdzono kompilację w programie Configuration Manager i teraz działa (aplikacja komputerowa WPF).
danglund

1
Jeśli wykonałeś wszystkie powyższe czynności i sprawdziłeś ustawienia platformy, skompiluj ustawienia konfiguracji, wyczyściłeś rozwiązanie i nadal nie działa - wyszukaj wszystkie wystąpienia biblioteki DLL i usuń je.
Will Calderwood,

z VS 2015 jest to nadal ważne - chociaż nie musiałem restartować :)
niesamowicie

Otóż ​​to! Ponownie odwiedź ustawienia programu Menedżer konfiguracji jest odpowiedzią.
AndyUK

74

W Visual Studio kliknij projekt prawym przyciskiem myszy -> W lewym okienku kliknij kartę Kompilacja ,

Właściwości projektu, karta kompilacji

w obszarze Platform Target wybierz x86 (lub bardziej ogólnie architekturę pasującą do biblioteki, do której się łączysz)

Właściwości projektu, cel platformy

Mam nadzieję, że to komuś pomoże! :)


2
To rozwiązało mój problem w VS2013, znalazłem alternatywną poprawkę, aby pozostawić „Platform docelowy” jako „Dowolny procesor”, ale zaznacz pole wyboru „Preferuj 32-bit”.
user1069816

2
Chociaż musisz używać platformy .NET 4.5 lub nowszej, aby móc zaznaczyć pole wyboru „Preferuj
wersję

1
Tak, ale przekonwertowałem swój projekt w „Any CPU” na „x64”. Mój 32-bitowy projekt działa dobrze, ale ten sam kod przekonwertowałem na 64-bitowy, ten projekt nie działa dobrze jako 32-bitowy. Czy możesz mi podać właściwy 64-bitowy proces konwersji ...
Ismayil S

@IsmayilS upewnij się, że używasz 64-bitowej wersji biblioteki, do której
linkujesz

53

Właśnie miałem ten problem. Wypróbowałem wszystkie sugestie tutaj, ale nie pomogły.

Znalazłem inną rzecz, by to naprawić. W Visual Studio kliknij projekt prawym przyciskiem myszy i otwórz „Właściwości”. Kliknij kartę „Kompiluj” (lub „Kompiluj”), a następnie kliknij „Zaawansowane opcje kompilacji” u dołu.

Sprawdź listę rozwijaną „Docelowy procesor”. Powinien pasować do budowanej platformy. To znaczy, jeśli budujesz „Dowolny procesor”, to „Docelowy procesor” powinien powiedzieć „Dowolny procesor”. Przejdź przez wszystkie swoje platformy, aktywując je i sprawdź to ustawienie.


2
A dla tych z nas, którzy używają tylko kompilatora, moją poprawką było dodanie „/ platform: x86” do flag kompilatora.
Urchin

To również mnie naprawiło. Musiałem dostosować „cel platformy” na karcie „Kompilacja”.
Jowen

jeśli korzystasz z wersji 64-bitowej, sprawdź także flagę „preferuj wersję 32-bitową”. Musiałem to wyłączyć dla siebie.
N4ppeL

51

Jeśli napotkasz ten błąd po kliknięciu przycisku zielonej strzałki, aby uruchomić aplikację, ale nadal chcesz uruchomić aplikację w wersji 64-bitowej. Możesz to zrobić w VS 2013, 2015, 2017 i 2019

Przejdź do: Narzędzia> Opcje> Projekty i rozwiązania> Projekty internetowe> Użyj 64-bitowej wersji IIS Express


3
Dzięki. Próbowałem tak wielu i nic nie pomogło. Jesteś moim ratownikiem. Mam 64-bitowy system operacyjny, zainstalowałem 64-bitowe studio Visual [które nadal działa jako 32-bitowe z nieznanego powodu]. Kiedy ustawiłem docelową platformę na x64, zgłaszał błąd BadImageFormatException. Po poprawce zadziałało. Dałem ci głos. You rock
SKCS Kamal

Cieszę się, że mogłem pomóc :)
paibamboo

Oto odpowiedź, której potrzebuję. Wielkie dzięki!
yushulx

Wielkie dzięki, to rozwiązało problem. Działa dobrze z 32-bitowym procesem Visual Studio 2017.
samir105

1
nadal działa z VS 2019, dziękuję
Jake Gaston

36

Jeśli używasz dowolnego procesora , możesz napotkać ten problem, jeśli zaznaczona jest opcja Preferuj 32-bit :

Usuń zaznaczenie tej opcji na karcie Kompilacja właściwości projektu !

wprowadź opis zdjęcia tutaj


3
Przydałoby się wskazanie, gdzie w Visual Studio można znaleźć tę opcję.
trysis

@trysis, ta opcja znajduje się na stronie Kompilacja w panelu ustawień projektu.
Drew Noakes

1
Mówiłem, że byłoby pomocne, aby je wstawić. W tej odpowiedzi nie ma kontekstu, aby powiedzieć nieszczęsnemu, być może nowemu użytkownikowi StackOverflow, gdzie go znaleźć.
trysis

Jaka jest ścieżka do uzyskania tego formularza? Nie mogę tego znaleźć
Adolfo Correa,

W Visual Studio kliknij prawym przyciskiem myszy projekt i wybierz „Właściwości”.
Drew Noakes

8

Trochę nie na temat tego postu, ale poszukiwanie tego komunikatu o błędzie mnie tu przywiodło.

Jeśli budujesz za pośrednictwem systemu zespołu i pojawia się ten błąd, karta procesu definicji kompilacji ma ustawienie „Platforma MSBuild”. Jeśli ta opcja jest ustawiona na „Auto”, może wystąpić ten problem. Zmiana na „X86” może również rozwiązać błąd.


to jest najbliższa odpowiedź na to, czego doświadczyłem. Miałem dll, który musiał być x86. Użyłem go w innym projekcie, którym był domyślnie AnyCPU. Muszą tylko dopasować. W tym przypadku nie miało to większego znaczenia, więc zmieniłem nowy projekt na x86.
greg

8

W moim przypadku korzystałem z natywnej biblioteki DLL w języku C #. Ta biblioteka DLL zależała od kilku innych brakujących bibliotek DLL. Po dodaniu innych bibliotek DLL wszystko działało.


4

Opierając się na odpowiedzi @paibamboo

Powiedział: Przejdź do: Narzędzia> Opcje> Projekty i rozwiązania> Projekty internetowe> Użyj 64-bitowej wersji IIS Express

Mój współpracownik zaznaczył to pole (wyraźnie go szukał), ale zapytał o komunikat o błędzie. Po kilku godzinach odznaczył pole i ponownie je zaznaczył. Lo i patrz: kod działał teraz z sukcesem.

Wygląda na to, że istnieją dwa miejsca, w których zapisano stan tego urządzenia, które zostały zsynchronizowane. Odznaczenie i ponowne sprawdzenie zsynchronizowało go ponownie.

Pytanie dla bardziej kompetentnych użytkowników: czy w zeszłym tygodniu pojawiła się aktualizacja lub coś (dla VS 2015), która zsynchronizowała stany?


3

Zobacz także tę odpowiedź , która rozwiązała dla mnie ten sam problem.

Wysłany przez Luis Mack w dniu 2010-05-12 o 08:50 Znalazłem ten sam problem, tylko w przypadku konkretnego projektu podczas kompilacji na komputerze 64-bitowym. Rozwiązaniem, które SEEMS działa, jest ręczna zmiana jednego znaku w strumieniu obrazu za każdym razem, gdy kontrolka użytkownika lub formularz są edytowane w projektancie

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w

Zmień na

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w

To jest 00LjAuMC4w z powrotem do 0yLjAuMC4w na końcu linii (00 z powrotem do 0y)


1
Krótkie streszczenie linku byłoby pomocne @Shaul :)
Marvin Thobejane

Wspaniały. Dzięki, odprawa dodaje treść do twojego komentarza
Marvin Thobejane

2

W moim przypadku używam małego pliku .exe, który ponownie ładuje przywoływane biblioteki DLL za pomocą Reflection. Wykonuję więc następujące kroki, które oszczędzają mi dzień:

Z właściwości projektu w eksploratorze rozwiązań na karcie kompilacji wybieram docelową platformę x86


2

W moim przypadku przeprowadzałem testy przez MSTest i dowiedziałem się, że wdrażam zarówno 32-bitową, jak i 64-bitową bibliotekę DLL w katalogu testowym. Program faworyzował 64-bitową bibliotekę DLL i powodował jej awarię.

TL; DR Upewnij się, że wdrażasz tylko 32-bitowe biblioteki DLL do testów.


2

Mieliśmy podobny problem i udało nam się go naprawić, ustawiając docelową platformę na x86. Właściwości projektu-> kompilacja


Więc biblioteki DLL x86 różnią się od x64? Czy istnieje sposób na wykrycie tego w pliku dll, do którego istnieje odwołanie?
NoBugs,

@NoBugs Wygląda na to, że możesz. Obejrzyj ten wątek
Joe,

1

Rozwiązałem ten problem w sposób „Windows”. Po sprawdzeniu wszystkich ustawień, wyczyszczeniu rozwiązania i przebudowaniu go, po prostu zamykam rozwiązanie i ponownie je otwieram. Potem działało, więc VS prawdopodobnie nie pozbył się niektórych rzeczy podczas czyszczenia. Kiedy rozwiązania logiczne nie działają, zwykle przechodzę na rozwiązania nielogiczne (lub pozornie nielogiczne). Windows mnie nie zawodzi. :)


1

Udało mi się rozwiązać ten problem, dopasowując moją wersję kompilacji do wersji .NET na serwerze.

Dwukrotnie kliknąłem plik .exe, aby zobaczyć, co się stanie, i kazałem zainstalować 4.5 ....

Więc obniżyłem do 4.0 i zadziałało!

Upewnij się więc, że Twoje wersje pasują. Działa poprawnie na moim dev dev box, ale serwer miał starszą wersję .NET.


1

W moim przypadku była to nieprawidłowa zawartość pliku. Biblioteka DLL została pobrana z Internetu, ale zawartość biblioteki DLL to strona HTML: D Spróbuj sprawdzić, czy jest to plik binarny, czy wygląda na poprawną bibliotekę DLL :)


1

Ten sam problem występował w rdzeniu .NET. Rozwiązaniem było pobranie 32-bitowego środowiska uruchomieniowego .netcore i posiadanie celu projektux86

W swoim csprojpliku dodaj

  <PropertyGroup>
    <PlatformTarget>x86</PlatformTarget>  
  </PropertyGroup>

  <PropertyGroup>
    <RunCommand Condition="'$(PlatformTarget)' == 'x86'">$(MSBuildProgramFiles32)\dotnet\dotnet</RunCommand>    
  </PropertyGroup>

To było używane na komputerze z systemem Windows, trzeba będzie dostosować ścieżki i tak dla Linux / OSX


0

Jeśli importujesz niezarządzaną bibliotekę DLL, użyj

CallingConvention = CallingConvention.Cdecl 

w metodzie importowania DLL.


0

1: Przejdź do: Narzędzia> Opcje> Projekty i rozwiązania> Projekty internetowe> Użyj 64-bitowej wersji IIS Express 2: zmień poniższe ustawienie dla projektu usługi internetowej. wprowadź opis zdjęcia tutaj

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.