2011-06-29 12 views
10

Próbuję uruchomić moją aplikację .NET 3.5 WinForms na Win7 x64. Aplikacja korzysta z NHibernate i System.Data.OracleClient, aby uzyskać dostęp do bazy danych Oracle. Klient Oracle jest 32-bitowy.Jak wymusić uruchomienie aplikacji .NET w trybie 32-bitowym

Podczas uruchamiania aplikacji otrzymuję następujący komunikat o błędzie

próba załadowania biblioteki Oracle Client rzucił BadImageFormatException. Ten problem występuje podczas pracy w trybie 64-bitowym z zainstalowanymi 32-bitowymi komponentami klienta Oracle.

W odpowiedzi na to, że kierowane mój build na platformie x86:

Screenshot of the Build settings

Ku mojemu zaskoczeniu, ten sam komunikat o błędzie pojawił podczas próby wykonania tej nowej opierać się na Platforma Win7.

Zespół NHibernate jest ładowany w czasie wykonywania przez Assembly.Load("...");.

Czy to możliwe, że biblioteka DLL NHibernate nadal działa w trybie 64-bitowym, podczas gdy host hosta działa w trybie 32-bitowym. Brzmi to dla mnie dziwnie. A może z jakiegoś powodu moja aplikacja działa w trybie 64-bitowym, mimo że była kierowana na x86?


Aktualizacja:

Sprawdziłem moje binarnych za pomocą CorFlags i jest oznaczona 32 bitowe:

Microsoft (R) .NET Framework CorFlags Conversion Tool. Version 4.0.30319.1 
Copyright (c) Microsoft Corporation. All rights reserved. 

Version : v2.0.50727 
CLR Header: 2.5 
PE  : PE32 
CorFlags : 3 
ILONLY : 1 
32BIT  : 1 
Signed : 0 

ja również sprawdzić go w Menedżerze zadań, i ma *32 przyrostek .

Próbowałem również i wykorzystywane CorFlags aby dodać flagę 32bit do wszystkich zespołów, które pochodzą z mojej aplikacji. Nadal pojawia się ten sam komunikat o błędzie.

jestem zaskoczony ... zdziwiony ... zdziwiony ...

+1

Czy sprawdziłeś za pomocą menedżera zadań, czy program działa w trybie 32-bitowym lub 64-bitowym, gdy się zawiesza? Jeśli ma on "* 32" za swoją nazwą procesu, to jest 32-bitowy, w przeciwnym razie 64-bitowy (przy założeniu 64-bitowego systemu operacyjnego i systemu operacyjnego). –

+2

I na co celowałeś w x86? Twoja biblioteka zajęć? Twój program? Obie? –

+1

@Lasse: Bardziej szczegółowo aplikacja składa się z 3 warstw, 2 bibliotek DLL i 1 EXE, podczas gdy jedna biblioteka DLL odwołuje się do NHibernate. Skierowałem je wszystkie na x86 i upewniłem się, że podczas kompilacji projekt EXE wykorzystuje binaria x86 projektów DLL. Jedyne, czego nie mogę kontrolować, to sama biblioteka NHibernate. – chiccodoro

Odpowiedz

3

Zgadza się, to brzmi jak zespół NHibernate jest zbudowany z AnyCPU jako swój cel platformy. Będziesz potrzebował zespołu NHibernate, który jest zbudowany specjalnie dla x86.

+0

Hi sixlettervariables. Czy to oznacza, że ​​gdy EXE działa w trybie 32-bitowym, biblioteka DLL załadowana do tego samego procesu może nadal działać w trybie 64-bitowym? Jesteś pewny? Byłoby to dość niefortunne, ponieważ nie kontroluję buildów NHibernate ... – chiccodoro

+0

Nie, jak napisałem w mojej odpowiedzi, 32-bitowy proces nie może załadować 64-bitowych bibliotek DLL. –

+0

@Helge: Mówię, że załadował bibliotekę DLL AnyCPU, która następnie zażądała 64-bitowej biblioteki DLL. – user7116

6

Procesy 32-bitowe nie mogą załadować bibliotek 64-bitowych i vice versa (szczegóły: patrz this). Oznacza to, że jeśli proces pomyślnie załadował 64-bitową bibliotekę DLL, to zdecydowanie jest to proces 64-bitowy. Możesz to sprawdzić w Menedżerze zadań (jak zasugerował Lasse) lub w inny sposób opisany here. Ten artykuł zawiera również więcej informacji na temat .Net na Windows x64.

+0

Witam Helge, dziękuję za odpowiedź. Tak też by się spodziewałem (biblioteki DLL muszą działać w tym samym trybie co proces hosta). Sprawdziłem w Menedżerze zadań i używając CorFlags, a mój EXE jest 32-bitowy. (Zobacz aktualizację na moje pytanie). – chiccodoro

0

W przypadku, gdy pomaga komuś, miałem podobne objawy z 64-bitową wersją Oracle i 64-bitową wersją Windows 7. Opuściłem cel platformy sam (nie zmieniłem żadnych ustawień projektu). Zamiast tego po prostu zainstalowałem 32-bitową oracle i to rozwiązało problem. Należy zaktualizować zmienne środowiskowe (np. ORACLE_HOME, PATH), aby wskazywały wersję 32-bitową.

+0

Fajnie, miałem problemy z 32-bitowym, a na koniec instalowałem 64-bitowe rozwiązanie! – chiccodoro

2

Można spróbować RunAsx86

mogę użyć tego narzędzia do uruchamiania aplikacji .NET w trybie x86, gdy je uruchomić z linii poleceń.

0

Mam już wcześniej podobny problem. Mam usługę Windows przy użyciu Crystal Reports, wszystko było w porządku na mojej maszynie 64b, wszystko dostroiłem - projekt został zbudowany z myślą o architekturze x86.

Wystąpił problem podczas wdrażania na innym komputerze, usługa uległa awarii, ponieważ mechanizm Crystal Reports nie mógł załadować zestawu log4net.dll 1.2.10. Sprawdziłem katalog - wersja była tam 1.2.11, mój katalog lokalny zawierał tę samą wersję. The bindingRedirect nie działa.

Następnie sprawdziłem GAC - dll CR są podpisane i zostały dodane do GAC przez instalatora, log4net 1.2.10 był tam, ale architektura procesora nie była x86. Po dodaniu architektury log4net 1.2.10 dla architektury x86 działało to jak czar.

+0

Nie jestem pewien, ile jest to związane z pierwotnym pytaniem ... – chiccodoro

+0

Chciałem podzielić się moją historią i pokazać, że w końcu chodziło o zainstalowanie odpowiedniej wersji na GAC. –

0

Mam ten sam błąd w mojej aplikacji C++ oracle, które muszę uruchomić na 64-bitowej maszynie w maszynie 32-bitowej. błąd nieprawidłowego obrazu wynika z mieszania bibliotek dll w wersji 32-bitowej i 64-bitowej, więc użyłem narzędzia zależności, aby dowiedzieć się, które biblioteki DLL są wymieszane. W tej aplikacji znalazłem, że oci.dll są 64-bitowe, ponieważ mam zainstalowanego klienta Oracle 64-bitowego, ale wszystkie inne biblioteki DLL 32-bitowe. więc zainstalowałem klienta Oracle dla 32 bitów na maszynie 64-bitowej i rozwiązałem ten błąd.