2010-05-19 15 views
5

Oto moje pytanie. Jaki jest najlepszy sposób określenia architektury, na której działa twoja aplikacja?W jaki sposób mój program może ustalić, czy działa on w 32-bitowym lub 64-bitowym systemie Windows?

Co mam zrobić: na serwerze 64-bitowym chcę, aby moja aplikacja odczytywała 64-bitowe źródła danych (przechowywane w kluczowym oprogramowaniu Software \ Wow6432Node \ ODBC \ ODBC.INI \ ODBC Data Sources), a jeśli jest to 32-bitowe I chcą czytać 32-bitowe źródła danych (czytać z Software \ ODBC \ ODBC.INI \ ODBC Data Sources).

Być może brakuje mi tego punktu, ale nie chcę przejmować się trybem, w którym działa moja aplikacja. Po prostu chcę wiedzieć, czy system operacyjny ma 32 czy 64-bitowe.

[System.Environment.OSVersion.Platform nie wydaje się być dla mnie cięcie. Powracający Win32NT na moim lokalnym komputerze xp i na 64-bitowym serwerze win2k8 (nawet gdy wszystkie moje projekty są ustawione na docelowy "dowolny procesor")]

+0

duplikat http://stackoverflow.com/questions/266082/how-do-i-tell-if-my- Aplikacja-jest-działa-jako-32-lub-64-bitowa aplikacja –

Odpowiedz

3

Zwykle nie powinieneś się o to martwić. System automatycznie przekierowuje kwerendy rejestru do Software\Wow6432Node podczas uruchamiania aplikacji 32-bitowej na platformie 64-bitowej.

+1

Aby aplikacja była uruchamiana jako 32-bitowa niezależnie od platformy, zmień platformę exe na "tylko x86". Będzie nadal działać na platformach x64 i będzie automatycznie przekierowywany na klucze Wow6432Node. –

4

Wypróbuj usługę Environment.Is64BitOperatingSystem. Jest to nowa wersja dodana w .Net 4.0 specjalnie w celu sprawdzenia typu systemu operacyjnego.

+0

Dzięki, ale powinienem wspomnieć, że jestem ograniczony do .net 2.0 – user48408

2

Nie powinieneś bezpośrednio czytać Wow6432Node. Użyj opcji RegistryView, aby określić widok 32-bitowy podczas działania jako aplikacja 64-bitowa.

+0

Niestety 'RegistryView' dostępny tylko z .NET 4.0. – Regent

4

Proste, bezpieczne, wersja ramy agnostyk rozwiązanie bez uciekania się do rejestru:

Console.WriteLine(
    "Is 64-bit? {0}", 
    (
     System.Runtime.InteropServices.Marshal.SizeOf(typeof(IntPtr)) == sizeof(Int64) 
      ? "Yes" 
      : "No" 
    ) 
); 
+0

Całkiem elegancko! – code4life

+0

Tak, ale jeśli jego działanie w trybie 32-bitowym na maszynie 64-bitowej powyższe zwróci false - nie? – user48408