Mam pewne wątpliwości dotyczące opcji kompilacji platformy .NET w programie Visual Studio 2008.
Co to jest cel kompilacji „Any CPU” i jakie pliki generuje? Sprawdziłem wyjściowy plik wykonywalny tej kompilacji „Any CPU” i stwierdziłem, że są to pliki wykonywalne x86 (które nie widziałyby tego nadchodzącego!). Czy jest jakaś różnica między kierowaniem pliku wykonywalnego na x86 a „dowolnym procesorem”?
Inną rzeczą, którą zauważyłem, jest to, że zarządzane projekty C ++ nie mają tej platformy jako opcji. Dlaczego? Czy to oznacza, że moje podejrzenie, że pliki wykonywalne „Any CPU” są zwykłymi plikami 32-bitowymi, jest słuszne?
.net
visual-studio-2008
build
64-bit
galety
źródło
źródło
Any CPU
i działasz w 64-bitowym systemie operacyjnym, tracisz możliwość edycji i kontynuowania podczas debugowania. (Skutecznie debugujesz proces 64-bitowy). Można ustawić cel projektu Autostart,x86
aby omijał to podczas debugowania. (Zespoły przywołane w projekcie startowym mogą nadal być celemAny CPU
.x86
żeAnyCPU
aplikacja została zużyta przez bibliotekę, w której musiałem ustawić,Prefer 32-bit
aby uniknąć błędu ładowania.Odpowiedzi:
AnyCPU będzie JIT do kodu 64-bitowego, gdy zostanie załadowany do procesu 64-bitowego i 32-bitowego, gdy zostanie załadowany do procesu 32-bitowego.
Ograniczając procesor, można by powiedzieć: Zespół używa czegoś (prawdopodobnie niezarządzanego), który wymaga 32 bitów lub 64 bitów.
źródło
Myślę, że większość ważnych rzeczy została już powiedziana, ale pomyślałem, że dodam jedną rzecz: jeśli skompilujesz jako Any CPU i uruchomisz platformę x64, nie będziesz w stanie załadować 32-bitowych plików DLL, ponieważ twoja aplikacja nie została uruchomiona w WoW64 , ale pliki DLL muszą tam zostać uruchomione.
Jeśli skompilujesz jako x86, system x64 uruchomi aplikację w WoW64 i będziesz mógł załadować 32-bitowe pliki DLL.
Myślę więc, że powinieneś wybrać „Dowolny procesor”, jeśli twoje zależności mogą działać w dowolnym środowisku, ale wybierz x86, jeśli masz zależności 32-bitowe. W tym artykule Microsoft wyjaśnia to nieco:
/ CLRIMAGETYPE (Określ typ obrazu CLR)
Nawiasem mówiąc, ta inna dokumentacja Microsoft zgadza się, że x86 jest zwykle bardziej przenośnym wyborem:
źródło
Oto krótki przegląd wyjaśniający różne cele kompilacji.
Z własnego doświadczenia wynika, że jeśli chcesz zbudować projekt, który będzie działał zarówno na platformach x86, jak i x64, a nie masz żadnych konkretnych optymalizacji x64, zmieniłbym kompilację tak, aby zawierał „x86”.
Powodem tego jest czasem uzyskanie kolizji plików DLL lub kodu powodującego awarię WoW w środowisku x64. Określając x86, system operacyjny x64 będzie traktował aplikację jako czystą aplikację x86 i upewni się, że wszystko działa płynnie.
źródło
Zobacz artykuł Objaśnienie celu platformy Visual Studio .NET .
Zgłoszono, że powyższy link jest uszkodzony, więc oto kolejny artykuł z podobnym wyjaśnieniem: Co tak naprawdę oznacza AnyCPU w .NET 4.5 i Visual Studio 11
źródło
Kredyt do książki „CLR przez C #” , zobacz:
źródło
„Dowolny procesor” oznacza, że po uruchomieniu programu .NET Framework na podstawie bitów systemu operacyjnego ustali, czy uruchomić program w wersji 32-bitowej czy 64-bitowej.
Istnieje różnica między procesorem x86 a dowolnym procesorem : w systemie x64 plik wykonywalny skompilowany dla X86 będzie działał jako plik wykonywalny 32-bitowy.
Jeśli chodzi o twoje podejrzenia, po prostu przejdź do wiersza polecenia programu Visual Studio 2008 i uruchom następujące polecenie.
Powie Ci bitness twojego programu, a także o wiele więcej.
źródło
Każdy procesor oznacza, że będzie działał na dowolnej platformie. Wynika to z faktu, że kod zarządzany jest podobny do Java. Pomyśl o tym jako o kompilacji do kodu bajtowego, który jest interpretowany przez .NET Framework w czasie wykonywania.
C ++ nie ma tej opcji, ponieważ jest kompilowany do kodu maszynowego specyficznego dla platformy.
źródło
Polecam przeczytanie tego postu .
Podczas korzystania z AnyCPU semantyka jest następująca:
źródło
Tak to zrobiłem w Visual Studio 2017:
źródło