2009-06-03 9 views
9

Mam 32-bitową dll kompilowaną, gdy próbuję użyć jej w aplikacji 64-bitowej, której nie można załadować, Więc chciałbym przekonwertować bibliotekę DLL na 64-bitową. Działa poprawnie, gdy platforma aplikacji zmieniła się z "Any CPU" lub "x64" na "x86". Ale chcę użyć go pod 64 bit, Ponieważ mam zamiar wywołać dll ze stron ASP.Konwersja 32-bitowego dll do 64-bitowego dll

Proszę, pomóżcie mi z tym.

+0

Czy to dll można skompilować? – kbyrd

Odpowiedz

0

Jeśli chcesz wczytać czystą bibliotekę C# w procesie 32- i 64-bitowym, prawidłowym wyborem jest AnyCPU. Spowoduje to skompilowanie biblioteki DLL jako agnostyki CPU i będzie można ją załadować do dowolnego typu procesu.

Nie jestem w 100% pewien, że o to pytasz. Jeśli nie, możesz wyjaśnić swoje pytanie?

10

System Windows NIE MOŻE załadować 32-bitowej biblioteki DLL do procesu 64-bitowego - jest to ograniczenie, którego nie można ominąć. Oznacza to, że jeśli twoja 32-bitowa biblioteka DLL wykonuje jakiekolwiek P/Invokes do innych 32-bitowych bibliotek DLL (lub używa jakiejkolwiek 32-bitowej biblioteki DLL z .NET), będziesz całkowicie pozbawiony szczęścia (będziesz musiał uruchomić całą witrynę w wersji 32-bitowej).

Nie wiadomo, kiedy to działa, a kiedy nie. Oto wyjaśnienia:

  1. x86 - 32bit - Nie można załadować do procesu 64-bitowego.
  2. x64 - 64bit - Nie można wykonać na komputerze 32-bitowym.
  3. AnyCPU - dual - Może być ładowany i wykonywany w obu środowiskach.

chodzi o AnyCPU:

  1. procesu na maszynie 64-64-bitowej - DLL ładowane jako 64-bitowe.
  2. Proces 32-bitowy na maszynie 32-bitowej - biblioteka DLL jest ładowana jako 32-bitowa.
  3. Proces 32-bitowy na maszynie 64-bitowej - biblioteka DLL jest ładowana jako 32-bitowa.

W większości przypadków dobrze jest zostawić go jako AnyCPU. Jednakże, jak już wspomniałem, jeśli używasz natywnych lub 32-bitowych bibliotek DLL, będziesz musiał utworzyć całą aplikację 32-bitową (i nie ma nic, co można, lub Microsoft mógłby zrobić w tej sprawie).

+0

Nie tylko Windows, wszystkie systemy operacyjne! –

+0

Jest to możliwe przy użyciu warstwy thunking i sprytnego kodu. Niektóre kompilatory obsługują thunking i wykonają dla ciebie całą ciężką pracę. Zrobiłem to już wcześniej w OS/2. tj. załadował i użył 16-bitowej biblioteki DLL z 32-bitowego procesu, a także 32-bitowej biblioteki DLL z 16-bitowego procesu. Ale nie jest możliwe uruchomienie 64-bitowego kodu natywnie na komputerze 32-bitowym. – Matt

+0

Dziękujemy! Moja aplikacja uległa awarii podczas instalacji systemu Windows x64 - wygląda na to, że trzecia strona DLL została skompilowana jako x86. Ustawienie mojej aplikacji na x86 naprawiło to. – mbmcavoy

2

Flaga x86 jest zwykle ustawiana z konkretnego powodu, więc może to być zły pomysł, aby ją zmienić. Ale jeśli jesteś absolutnie pewien, istnieje narzędzie, corflags.exe. Mam go pod C: \ Program Files \ Microsoft SDK \ Windows \ v6.0A \ bin. Oczywiście pomoże to tylko w zestawach .net.