[c#] ProgramFilesX86 opvragen?

Pagina: 1
Acties:

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 23-12-2025

_Thanatos_

Ja, en kaal

Topicstarter
Ik probeer achter de directory "C:\Program Files (x86)" te komen, op mijn x64 systeem. Het lukt echter van geen kanten. Het eerste probleem is dat Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) de directory "C:\Program Files" teruggeeft, en dat is de 64-bits hoek, welke ik niet moet hebben. Strikt genomen klopt het overigens, omdat de assembly is ook 64-bits.

Maargoed, ik dus maar op zoek naar de CPU-architextuur die er bij mij inzit. Het is een AMD64 en het draait op XP x64, dus dat moet je ergens terug kunnen vinden. Twee mogelijkheden:
C#:
1
2
3
4
System.Reflection.PortableExecutableKinds peKind;
System.Reflection.ImageFileMachine architecture;
System.Reflection.Assembly.GetExecutingAssembly().
   GetModules()[0].GetPEKind(out peKind, out architecture);
C#:
1
2
3
System.Reflection.ProcessorArchitecture architecture =
   System.Reflection.Assembly.GetExecutingAssembly().
   GetName().ProcessorArchitecture;

In de eerste methode wordt de architecture variabele doodleuk met I386 gevuld. Daar klopt volgens mij geen hout van, van zowel het OS als de CPU als de assembly is AMD64 en niet I386.

De tweede methode is nog vreemder. Die geeft MSIL terug. Ja, de calling exe is een .NET exe, maar om dan voor iedere en elke .NET te zeggen dat het MSIL architectuur is. Een beetje lui programmeren, want dat betekent dat die andere mogelijke uitkomsten (Amd64, IA64, X86 en None :?) dus nooit teruggegeven zullen worden, want vanuit een native exe kun je deze methode niet aanroepen.

Maargoed, ik denk sowieso niet dat ik me in allerlei bochten moet gaan wringen om een pad op te vragen. Met standaard windows API kan het gewoon, omdat er een ProgramFilesX86 (ofzo) contante voor is. Maar hoe kom je er met C# dan bij...?

日本!🎌


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

dat van die MSIL is normaal...

je assembly is pas in een native instructieset op het moment dat je die voorcompileert. kijk maar eens in de GAC (c:\windows\assembly)

Je kan waarschijnlijk in C# ook wel die environment variable opvragen hoor. Eventueel moet je een P/Invoke doen om die WinAPI functie te gebruiken.

ASSUME makes an ASS out of U and ME


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 23-12-2025

_Thanatos_

Ja, en kaal

Topicstarter
Nou ik heb dus ook een search op "X64" en "AMD64" in de Reflector gedaan, maar niks behalve de twee mogelijkheden waar ik al mee kwam. Of ik moet iets over het hoofd zien... Het is toch best triviaal om op te vragen hoeveel bits het onderliggende OS is? Zeker in een OS-semi-independent omgeving is het interessant om dat op te vragen...

日本!🎌


  • BertS
  • Registratie: September 2004
  • Laatst online: 13-02 08:33
Kijk eens op deze pagina onder "32-bit Applications".
en ook op deze, over system32.

Wellicht kom je daar verder mee.