Jaki jest cel ustawienia „Preferuj 32-bit” w programie Visual Studio i jak ono faktycznie działa?

204

Wpisz opis zdjęcia tutaj

Nie jest dla mnie jasne, w jaki sposób kompilator będzie wiedział, jak się kompilować w wersji 64-bitowej, kiedy będzie to konieczne. Skąd ma wiedzieć, kiedy może śmiało celować na 32-bit?

Jestem głównie ciekawy, w jaki sposób kompilator wie, na którą architekturę celować podczas kompilacji. Czy analizuje kod i podejmuje decyzję na podstawie tego, co znajdzie?

Aaron
źródło
Ach, dzięki. Nie widziałem tego wcześniej. Nadal jestem ciekawy, w jaki sposób kompilator automatycznie wie, na którą architekturę należy kierować. Jakieś pomysły?
Aaron

Odpowiedzi:

219

Microsoft ma wpis w blogu, co naprawdę oznacza AnyCPU od .NET 4.5 i Visual Studio 11 :

W .NET 4.5 i Visual Studio 11 ser został przeniesiony. Domyślną wartością dla większości projektów .NET jest ponownie AnyCPU, ale teraz AnyCPU ma więcej niż jedno znaczenie. Istnieje dodatkowy podtyp AnyCPU, „Preferowany dowolny procesor 32-bitowy”, który jest nowym ustawieniem domyślnym (ogólnie jest teraz pięć opcji przełącznika kompilatora C # / platform: x86, Itanium, x64, anycpu i anycpu32bitpreferred ). Gdy używasz smaku „Preferuj 32-bity” AnyCPU, semantyka jest następująca:

  • Jeśli proces działa w 32-bitowym systemie Windows, działa jako proces 32-bitowy. IL jest kompilowany do kodu maszynowego x86.
  • Jeśli proces działa w 64-bitowym systemie Windows, działa jako proces 32-bitowy. IL jest kompilowany do kodu maszynowego x86.
  • Jeśli proces działa w systemie ARM Windows, działa jako proces 32-bitowy. IL jest kompilowany do kodu maszynowego ARM.

Różnica między „preferowanym dowolnym procesorem 32-bitowym” a „x86” polega tylko na tym, że aplikacja .NET skompilowana do x86 nie będzie działać w systemie ARM Windows, ale aplikacja „dowolna preferowana 32-bitowa jednostka” będzie działać poprawnie.

Lex Li
źródło
12
+1. Ponadto pole wyboru „Preferuj 32-bit” jest włączone tylko dla projektów wykonywalnych .NET 4.5+.
Lee Grissom,
12
Kolejną zaletą anycpu32bitspreferred jest to, że inny plik .exe działający w 64 bitach może załadować ten zestaw.
Bruno Martinez
30
Osobiście uważam, że to okropne, że ustawiają to domyślnie bez ustawienia Narzędzia, aby to wyłączyć. Co gorsza, nie można go wyszukać, ponieważ nie ma go w plikach csproj, chyba że jest wyłączony! Prawdopodobnie dodane z powodu niezgodności Office Automation z CPUAny na komputerze x64, z większością osób instalujących 32-bitowy pakiet Office.
Dave
6
@BrianDavidBerman istnieje, jeśli ustawisz false na 32-ale preferujesz i ustawisz x64 lub Any CPU na komputerze 64-bitowym.
Lex Li
6
Różnica między preferowanym bitem x86 a dowolnym procesorem 32-bitowym polega na tym, że w drugim przypadku na pliku wykonywalnym ustawiona jest flaga largeaddressaware. Oznacza to, że 32-bitowy proces działający w 64-bitowym systemie operacyjnym może zużywać 2 GB pamięci w trybie x86 i 4 GB pamięci w dowolnym preferowanym trybie 32-bitowym.
Nic
6

Oto prosta odpowiedź:

Arch. Aplikacji

Uwaga: AnyCPU-32bitPreferred jest dostępny tylko w wersji .Net 4.5 i wyższej.

Yousha Aleayoub
źródło
2
Jaka jest różnica między „działaniem jako 32-bit” a działaniem jako „WoW64”. Pomyślałem, że WoW64 = „Windows (32-bit) na Windows64” i jest potrzebny do uruchomienia dowolnej aplikacji 32-bitowej.
Peter Cordes
Czy jest na to źródło? Niby wszędzie jeszcze mówi mi, że domyślnie jest to anycpu32bitpreferred, co stanowi ogromną różnicę dla osób korzystających z 64-bitowych maszyn z systemem Windows (to dużo).
Ran Sagy,
@RanSagy możesz go po prostu przetestować, tworząc nowy projekt i sprawdzając Project -> Properties -> Build tab -> Platform target... ale pamiętaj, że AnyCPU-32bitPreferredjest on dostępny tylko w .Net w wersji 4.5 i wyższej. Dlatego domyślnie jest AnyCPU.
Yousha Aleayoub,
W niektórych przypadkach mój był wyszarzony; Miałem tylko nadzieję, że jest jakaś dokumentacja na temat tego, co dzieje się w .net 4.5+ lub .net standard / core (lub naprawdę MSBuild 16)
Ran Sagy
-1

Powód jest taki: jeśli nie chcesz używać więcej pamięci w 64-bitowych aplikacjach. Co oznacza, że ​​jeśli twoją aplikacją jest AnyCPU , chcesz działać jako 32-bitowy.

Aby dodać więcej, ustawienie w Visual Studio jest ukierunkowane na konkretny CLR:

Visual Studio instaluje 32-bitową wersję CLR na komputerze z procesorem x86 oraz zarówno wersję 32-bitową, jak i odpowiednią 64-bitową wersję CLR na 64-bitowym komputerze z systemem Windows. (Ponieważ Visual Studio to aplikacja 32-bitowa, gdy jest instalowana w systemie 64-bitowym, działa pod WOW64).

Zobacz artykuł 64-bitowe aplikacje ( MSDN ).

Peru
źródło
1
Nie jestem pewien, czy to dokładne. Rozumiem, że pliki wykonywalne .NET niezależnie od 32 lub 64 są nadal ograniczone do około 2 GB na proces.
JP Richardson
1
Edytowałem moją odpowiedź. Ale nie jestem pewien, czy tego właśnie szukasz :)
Peru,
2
@Aaron, kompilator zasadniczo ustawia flagę dla środowiska wykonawczego, aby zdecydować, czy można załadować zestaw (tj. Zablokować zestaw tylko x86, który ma zostać załadowany w procesie x64) i jak uruchomić proces (dla nowego EXE) na podstawie flag. Uważam, że IL jest taki sam dla obu smaków.
Aleksiej Lewenkow
1
@JPRichardson Tak masz rację. Ale w .net 4.5 masz możliwość zwiększenia rozmiaru. odsyłają MSDN
Peru
40
@JPRichardson, ani 32-bitowy, ani 64-bitowy plik wykonywalny .Net ograniczony do 2 GB na proces - po pierwsze przestrzenią adresową na proces jest ograniczenie na poziomie systemu operacyjnego (2/3 + GB dla procesu 32-bitowego i znacznie więcej dla wersji 64-bitowej), druga nawet wersja 32-bitowa może użyj więcej niż 2 GB, jeśli w pliku wykonywalnym ustawiona jest flaga „LargeAddressAware”. Jedyne znane mi ograniczenia 2 GB dotyczą rozmiarów tablicy / alokacji, które są ograniczone przez zakres Int32 (około 2 GB).
Aleksiej Lewenkow