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

David Brown
źródło
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

bluwater2001
źródło
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.

David Brown
źródło
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! :)

Marvin Thobejane
źródło
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.

Denis
źródło
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

paibamboo
źródło
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

Drew Noakes
źródło
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.

StingyJack
źródło
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.

Tomasz Stypich
źródł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?

MilConDoin
źródło
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)

Shaul Behr
źródło
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

asdf_enel_hak
źródło
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.

Mike Cluck
źródło
2

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

Joe
źródło
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. :)

użytkownik1771386
źródło
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.

Nateous
źródło
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 :)

Ludwo
źródło
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

Samir Banjanovic
źródło
0

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

CallingConvention = CallingConvention.Cdecl 

w metodzie importowania DLL.

Ramkumar Shanmugam
źródło
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

Mani
źródło