IntPtr.Size nie zwróci poprawnej wartości, jeśli działa w 32-bitowym .NET Framework 2.0 w 64-bitowym systemie Windows (zwróci 32-bit).
Jak opisuje Raymond Chen Microsoftu, musisz najpierw sprawdzić, czy działa w procesie 64-bitowym (myślę, że w .NET możesz to zrobić, sprawdzając IntPtr.Size), a jeśli pracujesz w procesie 32-bitowym, nadal wywołać funkcję Win API IsWow64Process. Jeśli zwraca wartość true, uruchomiony jest proces 32-bitowy w 64-bitowym systemie Windows.
Microsoft Raymond Chen:
Jak programowo wykryć, czy używasz 64-bitowego systemu Windows
Moje rozwiązanie:
static bool is64BitProcess = (IntPtr.Size == 8);
static bool is64BitOperatingSystem = is64BitProcess || InternalCheckIsWow64();
[DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool IsWow64Process(
[In] IntPtr hProcess,
[Out] out bool wow64Process
);
public static bool InternalCheckIsWow64()
{
if ((Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor >= 1) ||
Environment.OSVersion.Version.Major >= 6)
{
using (Process p = Process.GetCurrentProcess())
{
bool retVal;
if (!IsWow64Process(p.Handle, out retVal))
{
return false;
}
return retVal;
}
}
else
{
return false;
}
}
System.Environment.Is64BitOperatingSystem
. Czy możesz to zmienić w swojej odpowiedzi lub wyrazić zgodę na edytowanie tego w swojej odpowiedzi?.NET 4 ma dwie nowe właściwości w klasie Environment: Is64BitProcess i Is64BitOperatingSystem . Co ciekawe, jeśli używasz Reflectora, możesz zobaczyć, że są one zaimplementowane inaczej w 32-bitowych i 64-bitowych wersjach mscorlib. Wersja 32-bitowa zwraca wartość false dla Is64BitProcess i wywołuje IsWow64Process przez P / Invoke dla Is64BitOperatingSystem. Wersja 64-bitowa po prostu zwraca wartość true dla obu.
źródło
if (IntPtr.Size == 8) return true; if(!DoesWin32MethodExist(...,"IsWow64Process")) return false; return IsWow64Process(GetCurrentProcess());
Is64BitProcess
iIs64BitOperatingSystem
(linki do wersji 2.0).Jeśli używasz .NET Framework 4.0, jest to łatwe:
Zobacz Environment.Is64BitOperatingSystem Właściwość (MSDN).
źródło
To tylko implementacja tego, co sugeruje powyżej Bruno Lopez, ale działa na Win2k + wszystkie dodatki Service Pack dla WinXP. Po prostu pomyślałem, że opublikuję to, aby inni ludzie nie rzucili go ręcznie. (opublikowałby jako komentarz, ale jestem nowym użytkownikiem!)
źródło
Pełna odpowiedź jest następująca (wzięta zarówno z odpowiedzi stefan-mg, ripper234, jak i BobbyShaftoe):
Najpierw sprawdź, czy jesteś w trakcie procesu 64-bitowego. Jeśli nie, sprawdź, czy 32-bitowy proces jest procesem Wow64.
źródło
Microsoft umieścił dla tego przykładowy kod:
http://1code.codeplex.com/SourceControl/changeset/view/39074#842775
To wygląda tak:
Dostępna jest również wersja WMI (do testowania zdalnych maszyn).
źródło
Możesz także sprawdzić
PROCESSOR_ARCHITECTURE
zmienną środowiskową.Nie istnieje lub jest ustawiony na „x86” w 32-bitowym systemie Windows.
źródło
prefer 32-bit
zAny CPU
jak twojePlatform Target
następnie dostanieszx86
, ale jeśli odznaczPrefer 32-bit
go będzie wtedy dostaćAMD64
.Z bloga Chriz Yuen
C # .Net 4.0 Wprowadzono dwie nowe właściwości środowiska Environment.Is64BitOperatingSystem; Environment.Is64BitProcess;
Zachowaj ostrożność podczas korzystania z obu tych właściwości. Przetestuj na komputerze z systemem Windows 7 64 bity
źródło
Najszybszy sposób:
Uwaga: jest to bardzo bezpośrednie i działa poprawnie na 64-bitach tylko wtedy, gdy program nie wymusza wykonywania jako proces 32-bitowy (np.
<Prefer32Bit>true</Prefer32Bit>
W ustawieniach projektu).źródło
Spróbuj tego:
źródło
@foobar: Masz rację, to jest zbyt łatwe;)
W 99% przypadków programiści ze słabym doświadczeniem administratora systemu ostatecznie nie zdają sobie sprawy z mocy, jaką Microsoft zawsze zapewniał każdemu, by wyliczyć Windows.
Administratorzy systemu zawsze piszą lepszy i prostszy kod, jeśli do tego dojdzie.
Niemniej jednak należy zauważyć, że konfiguracja kompilacji musi być AnyCPU, aby ta zmienna środowiskowa zwróciła prawidłowe wartości we właściwych systemach:
Zwróci to „X86” w 32-bitowym systemie Windows i „AMD64” w 64-bitowym systemie Windows.
źródło
Korzystanie z dotPeek pomaga zobaczyć, jak naprawdę robi to framework. Mając to na uwadze, oto co wymyśliłem:
Przykładowe użycie:
źródło
Użyj tych dwóch zmiennych środowiskowych (pseudo-kod):
Zobacz post na blogu HOWTO: Detect Bitity .
źródło
Z powodzeniem wykorzystałem tę kontrolę w wielu systemach operacyjnych:
Ten folder ma zawsze nazwę „SysWOW64”, bez względu na język systemu operacyjnego. Działa to dla .NET Framework 1.1 lub nowszego.
źródło
SysWOW64
w%windir%
32-bitowym systemie operacyjnym? Obecność folderu oznacza dokładnie to: że folder jest obecny.Muszę to zrobić, ale muszę też być w stanie, jako administrator, robić to zdalnie, w każdym razie wydaje mi się, że działa to całkiem nieźle:
źródło
Jest to rozwiązanie oparte na kodzie Microsoft pod adresem http://1code.codeplex.com/SourceControl/changeset/view/39074#842775 . Wykorzystuje metody rozszerzenia do łatwego ponownego wykorzystania kodu.
Niektóre możliwe zastosowania pokazano poniżej:
źródło
Oto bezpośrednie podejście w C # przy użyciu DllImport z tej strony .
źródło
IsWow64Process
nie istnieje.Używam następującego kodu. Uwaga: jest przeznaczony dla projektu AnyCPU.
źródło
Uważam, że jest to najlepszy sposób na sprawdzenie platformy systemu i procesu:
Pierwsza właściwość zwraca true dla systemu 64-bitowego, a false dla 32-bitowego. Druga właściwość zwraca true dla procesu 64-bitowego i false dla 32-bitowego.
Potrzeba tych dwóch właściwości polega na tym, że można uruchamiać procesy 32-bitowe w systemie 64-bitowym, dlatego należy sprawdzić zarówno system, jak i proces.
źródło
Wszystko w porządku, ale powinno to również działać z
env
:..
Może zbyt łatwe ;-)
źródło
Oto podejście do Instrumentacji zarządzania Windows (WMI):
źródło
OSInfo.Bits
źródło
Dodaj następujący kod do klasy w swoim projekcie:
Używaj go w ten sposób:
źródło
Użyj tego, aby uzyskać zainstalowaną architekturę Windows:
źródło
Biorąc pod uwagę, że przyjęta odpowiedź jest bardzo złożona. Istnieją prostsze sposoby. Mój jest odmianą anaswer Aleksandra. Biorąc pod uwagę, że 64-bitowe okna instalują 32-bitowe aplikacje w Program Files (x86), możesz sprawdzić, czy ten folder istnieje, używając zmiennych środowiskowych (w celu uzupełnienia różnych lokalizacji)
na przykład
To dla mnie jest szybsze i prostsze. Biorąc pod uwagę, że chcę uzyskać dostęp do określonej ścieżki w tym folderze w zależności od wersji systemu operacyjnego.
źródło
Cieszyć się ;-)
źródło
Zobacz, czy istnieje „C: \ Program Files (x86)”. Jeśli nie, to masz 32-bitowy system operacyjny. Jeśli tak, to system operacyjny jest 64-bitowy (Windows Vista lub Windows 7). Wydaje się to dość proste ...
źródło
Używam:
Uzyskuje to ścieżkę do uruchomienia aplikacji na wypadek, gdybyś zainstalował ją w różnych miejscach na komputerze. Możesz także zrobić ogólną
C:\
ścieżkę, ponieważ 99,9% komputerów ma zainstalowany system WindowsC:\
.źródło
Używam wersji:
źródło