Determinare versione Sistema Operativo

lunedì 10 maggio 2010 - 14.56

AntCiar Profilo | Expert

Salve a tutti.

Sto aggiornando la mia applicazione con VS 2005 - C# e avrei bisogno di capire se il sistema operativo su cui è installata l'applicazione è a 32 o 64 Bit.
Qualcuno mi può dire come fare per determinare questo valore?

Grazie a tutti
Cristian Barca

kataklisma Profilo | Senior Member

>Salve a tutti.

Ciao!

>Sto aggiornando la mia applicazione con VS 2005 - C# e avrei
>bisogno di capire se il sistema operativo su cui è installata
>l'applicazione è a 32 o 64 Bit.
>Qualcuno mi può dire come fare per determinare questo valore?

Ci sono varie soluzioni, da semplici workaround a call di funzioni Kernel32.

Workaround :
1)Controlla se esiste la cartella Program File (x86) se esiste è un s.o 64bit.
2)Controlla il valore di intptr.size se ritorna 8 è un 64bit se ritorna 4 è 32 bit, fermo restando che la compilazione è avvenuta con il platform target Any Cpu, se compili per x86 intPtr.size ritornerà sempre e comunque 4, anche se il s.o è 64bit.

Call funzione Kernel32.dll :

Richiami IsWow64Process :

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

>Grazie a tutti
;) Ciao!

------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

AntCiar Profilo | Expert

Ciao Ignazio.

Sto provando ad utilizzare il 2 metodo (Kernel)

Ho postato il codice all'interno della mia applicazione ma mi segnala errore su 'SafeProcessHandle'. Non riesce a trovare il tipo/classe e nemmeno mi compare il quadratino per fare l'using in automatico.
Cristian Barca

kataklisma Profilo | Senior Member

>Ciao Ignazio.

;)

>Sto provando ad utilizzare il 2 metodo (Kernel)
>
>Ho postato il codice all'interno della mia applicazione ma mi
>segnala errore su 'SafeProcessHandle'. Non riesce a trovare il
>tipo/classe e nemmeno mi compare il quadratino per fare l'using
>in automatico.

Allora segui questi passi :

1)Importa using System.Runtime.InteropServices;
2)Ridefinisci la funzione in questo modo :

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

ho ridefinito hProcess come IntPtr, ho risolto cosi ;)

3)Utilizza la funzione in questo modo :

Process p = Process.GetCurrentProcess(); IntPtr handle = p.Handle; bool isWow64; bool risultato = IsWow64Process(handle, out isWow64); MessageBox.Show(isWow64.ToString());

Ciao!
------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

AntCiar Profilo | Expert

Grazie Ignazio.

Non ho ancora provato il codice ma da quello che vedo nel tuo post, accedi al processo corrente e quindi penso determini se l'applicazione è a 64 bit. giusto? se è così mi serve qualcosa "al contrario". Nel senso che ho bisogno di sapere se Windows è a 64 bit per poter decidere quale versione di applicazione installare.

Grazie ancora.
Cristian Barca

kataklisma Profilo | Senior Member

>Grazie Ignazio.
>
>Non ho ancora provato il codice ma da quello che vedo nel tuo
>post, accedi al processo corrente e quindi penso determini se
>l'applicazione è a 64 bit. giusto? se è così mi serve qualcosa
>"al contrario". Nel senso che ho bisogno di sapere se Windows
>è a 64 bit per poter decidere quale versione di applicazione
>installare.

Allora meglio che ti spieghi un po come funziona la cosa, cosi hai le idee piu chiare in merito.

Come sai, un'S.o 32 bit puo eseguire solamente applicazioni 32 bit, un S.O 64 bit puo eseguire applicazioni 64bit e applicazioni 32 bit.

Le applicazioni 32 bit in un so 64bit vengono eseguite tramite un "emulazione" chiamata appunto WOW64 (Windows on Windows 64bit), in pratica quando avvii l'applicazione windows determina se è un'applicazione 32 bit e avvia tutte le operazioni necessarie per eseguirla in emulazione.

Cio significa che se compili l'applicazione con platform target x86 e ti trovi su un 64 bit quella funzione ti ritornerà true perche il tuo processo sta girando in emulazione tramite WOW64 (tanto per delucidarti le idee, tutti i processi nel task manager che vengono riportati in questo modo : nomeprocesso.exe *32, sono in emulazione WOW64)

Quindi il trucco è sviluppare un'applicazione con platform target x86 e tramite isWow64 determinare se viene emulata o viene eseguita in modo nativo, quindi se ritorna true è un s.o 64 bit altrimenti un 32!

Spero ti sia stata d'aiuto questa breve introduzione teorica....:)

>Grazie ancora.
Ciao ;)

------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

AntCiar Profilo | Expert

Ciao Ignazio.

Ho postato il codice ed ora non ho problemi di compilazione.
L'unica cosa strana è che sembra tornare sempre "true".

Ora ti spiego le prove fatte:

Sulla mia macchina ho vista 32Bit. Ho compilato come platform Any CPU e richiamando la funzione mi restituisce True.
Ho creato la piattaforma x86 e dopo aver compilato e lanciato l'eseguibile della versione x86, mi restituisce sempre True.
non so perchè fa così ma sulla mia macchina dovrebbe restituirmi False visto che è a 32 bit

Devo ancora provare su un 64bit effettivo ma non posso farlo prima di oggi pomerig. perchè il collega si è portado ditro il portatile con Win seven.

grazie
Cristian Barca

kataklisma Profilo | Senior Member

>Ciao Ignazio.
Ciao!

>Ho postato il codice ed ora non ho problemi di compilazione.
>L'unica cosa strana è che sembra tornare sempre "true".
>
>Ora ti spiego le prove fatte:
>
>Sulla mia macchina ho vista 32Bit. Ho compilato come platform
>Any CPU e richiamando la funzione mi restituisce True.
>Ho creato la piattaforma x86 e dopo aver compilato e lanciato
>l'eseguibile della versione x86, mi restituisce sempre True.
>non so perchè fa così ma sulla mia macchina dovrebbe restituirmi
>False visto che è a 32 bit
>
>Devo ancora provare su un 64bit effettivo ma non posso farlo
>prima di oggi pomerig. perchè il collega si è portado ditro il
>portatile con Win seven.

Quindi su una macchina 32 bit ti ritorna sempre true...Purtroppo al momento non ho sottomano nessuna versione 32 bit di nessun O.S, ne in ufficio ne a casa, se puoi, posta i risultati del tuo "test" che ne discutiamo insieme ;)

>grazie
Di niente, è un piacere!

------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

AntCiar Profilo | Expert

Ciao Ignazio.

scusa per il ritardo. Allora ho fatto queste prove con compilazione Any CPU:

macchina con Vista a 32 bit --> risultato true
macchina con Seven a 32 bit --> risultato true

compilazione x86:

macchina con Vista a 32 bit --> risultato true
macchina con Seven a 32 bit --> risultato true
Cristian Barca

kataklisma Profilo | Senior Member

>Ciao IgnaziO
Ciao!

>scusa per il ritardo.
Tranquillo ;)

>Allora ho fatto queste prove...
>...
>...

Sono riuscito anchio ad effettuare qualche test...e i risultati riscontrati sono positivi, ovvero, dato come platform target x86 mi ritorna false su macchine a 32 bit e true su macchine 64 bit. (in quanto su piattaforme 32 bit un compilato x86 gira nativamente senza l'ausilio di WoW e quindi ritorna false, su macchine a 64bit il compilato x86 gira sotto emulazione WoW e quindi ritorna true)

potresti postare il codice che gli do un'occhiata?
I tuoi risultati sono molto strani!

;) ciao!
------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

AntCiar Profilo | Expert

ecco qua:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


tutto questo sta nella classe Program. Nella mainForm richiamo dopo il costruttore la funzione e memorizzo il risultato in una variabile. Questa nei miei casi è sempre '64'

Cristian Barca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5