.NET으로 Windows 64 비트 플랫폼을 감지하는 방법?


268

A의 .NET 2.0 C # 응용 프로그램 I는 운영 체제 플랫폼을 감지하기 위해 다음 코드를 사용 :

string os_platform = System.Environment.OSVersion.Platform.ToString();

"Win32NT"를 반환합니다. 문제는 Windows Vista 64 비트에서 실행될 때 "Win32NT"를 반환한다는 것입니다.

올바른 플랫폼 (32 또는 64 비트)을 알 수있는 다른 방법이 있습니까?

Windows 64 비트에서 32 비트 응용 프로그램으로 실행될 때 64 비트도 감지해야합니다.

답변:


200

64 비트 Windows에서 32 비트 .NET Framework 2.0을 실행하면 IntPtr.Size가 올바른 값을 반환하지 않습니다 (32 비트를 반환 함).

Microsoft의 Raymond Chen이 설명했듯이 먼저 64 비트 프로세스에서 실행 중인지 확인해야합니다 (.NET에서는 IntPtr.Size를 확인하여 수행 할 수 있다고 생각합니다) .32 비트 프로세스에서 실행중인 경우 여전히 Win API 함수 IsWow64Process를 호출해야합니다. 이것이 true를 반환하면 64 비트 Windows에서 32 비트 프로세스로 실행중인 것입니다.

Microsoft의 Raymond Chen : 64 비트 Windows에서 실행 중인지 프로그래밍 방식으로 감지하는 방법

내 해결책 :

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;
    }
}

7
32 비트 OS에서 실행할 때 해당 항목이 kernel32.dll에서 누락되어 IsWow64Process를 호출하면 예외가 발생합니다. 1code.codeplex.com/SourceControl/changeset/view/39074#842775 에서 codeplex에 표시된 솔루션을 확인해야합니다 .이 페이지 하단에 나열된 코드를 기반으로하는 솔루션이 있습니다. 코드 재사용.
dmihailescu

7
IsWow64Process는 Win XP SP2와 함께 도입되었습니다. XP SP2 또는 최신 버전이 필요한 경우이 코드가 제대로 작동합니다.
Marc

3
@dmihailescu, isWow64Process를 호출하기 전에 DoesWin32MethodExist를 사용할 수 있습니다. is64BitOperatingSystem의 .net 4.0 구현이하는 것입니다.
noobish

4
솔루션은 Widows 7 Ultimate 파티션을 사용하여 Bootcamp를 실행하는 Intel i7-3720QM 마이크로 프로세서가 장착 된 MacBook Pro에서 올바른 값을 반환합니다. +1
Mark Kram

11
참고 : .Net 4.0부터는 확인 만 가능 System.Environment.Is64BitOperatingSystem합니다. 이것을 답변으로 편집하거나 답변을 편집 할 수 있습니까?
Joel Coehoorn

241

.NET 4에는 Environment 클래스에 Is64BitProcessIs64BitOperatingSystem 의 두 가지 새로운 속성이 있습니다. 흥미롭게도, Reflector를 사용하면 32 비트 및 64 비트 버전의 mscorlib에서 다르게 구현되는 것을 볼 수 있습니다. 32 비트 버전은 Is64BitProcess에 대해 false를 반환하고 Is64BitOperatingSystem에 대한 P / Invoke를 통해 IsWow64Process를 호출합니다. 64 비트 버전은 둘 다 true를 반환합니다.


5
Reflector 대신 소스를 다운로드하는 것이 어떻습니까? 그런 다음 주석과 기타 "노트"를 얻습니다.
AMissico

3
참조 소스에 따르면 다음과 같은 작업을 수행합니다. if (IntPtr.Size == 8) return true; if(!DoesWin32MethodExist(...,"IsWow64Process")) return false; return IsWow64Process(GetCurrentProcess());(의사 코드)
다항식

5
좋은. 사용자가 .NET 4.0을 사용하는 경우 정답입니다 (예 : Environment.Is64BitOperatingSystem). -.NET 3.5에는 FYI 속성이없는 것으로 보입니다.
BrainSlugs83

4
이것은 구체적으로 .Net 2.0
abbottdev

.NET Core는 MIT 라이센스에 따라 릴리스되었으므로 Is64BitProcess및 의 소스 코드를 읽을 수 있습니다 Is64BitOperatingSystem(버전 2.0 링크).
Cristian Ciupitu


51

이것은 Bruno Lopez가 위에서 제안한 것의 구현 일 뿐이지 만 Win2k + 모든 WinXP 서비스 팩에서 작동합니다. 다른 사람들이 직접 롤링하지 않도록 게시 할 것이라고 생각했습니다. (댓글로 게시했을 것이지만 나는 새로운 사용자입니다!)

[DllImport("kernel32", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
public extern static IntPtr LoadLibrary(string libraryName);

[DllImport("kernel32", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
public extern static IntPtr GetProcAddress(IntPtr hwnd, string procedureName);

private delegate bool IsWow64ProcessDelegate([In] IntPtr handle, [Out] out bool isWow64Process);

public static bool IsOS64Bit()
{
    if (IntPtr.Size == 8 || (IntPtr.Size == 4 && Is32BitProcessOn64BitProcessor()))
    {
        return true;
    }
    else
    {
        return false;
    }
}

private static IsWow64ProcessDelegate GetIsWow64ProcessDelegate()
{
  IntPtr handle = LoadLibrary("kernel32");

  if ( handle != IntPtr.Zero)
  {
    IntPtr fnPtr = GetProcAddress(handle, "IsWow64Process");

    if (fnPtr != IntPtr.Zero)
    {
      return (IsWow64ProcessDelegate)Marshal.GetDelegateForFunctionPointer((IntPtr)fnPtr, typeof(IsWow64ProcessDelegate));
    }
  }

  return null;
}

private static bool Is32BitProcessOn64BitProcessor()
{
  IsWow64ProcessDelegate fnDelegate = GetIsWow64ProcessDelegate();

  if (fnDelegate == null)
  {
    return false;
  }

  bool isWow64;
  bool retVal = fnDelegate.Invoke(Process.GetCurrentProcess().Handle, out isWow64);

  if (retVal == false)
  {
    return false;
  }

  return isWow64;
}

49

전체 답변은 다음과 같습니다 (stefan-mg, ripper234 및 BobbyShaftoe의 답변 모두에서 가져옴).

    [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool IsWow64Process([In] IntPtr hProcess, [Out] out bool lpSystemInfo);

    private bool Is64Bit()
    {
        if (IntPtr.Size == 8 || (IntPtr.Size == 4 && Is32BitProcessOn64BitProcessor()))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    private bool Is32BitProcessOn64BitProcessor()
    {
        bool retVal;

        IsWow64Process(Process.GetCurrentProcess().Handle, out retVal);

        return retVal;
    } 

먼저 64 비트 프로세스인지 확인하십시오. 그렇지 않은 경우 32 비트 프로세스가 Wow64Process인지 확인하십시오.


13
Win2000 및 WinXP SP1 및 이전 버전에서는 실패합니다. XP SP2 및 Vista / Win7에만 도입되었으므로 호출하기 전에 IsWow64Process () 함수가 존재하는지 확인해야합니다.
user9876

2
@ user9876, 여전히 골동품 시스템을 목표로하는 사람이 있습니까?
CMircea

5
이 샘플은 Process.GetCurrentProcess ()에 의해 반환 된 Process 인스턴스를 삭제하지 못합니다.
Joe

42

Microsoft는 이에 대한 코드 샘플을 넣었습니다.

http://1code.codeplex.com/SourceControl/changeset/view/39074#842775

다음과 같이 보입니다 :

    /// <summary>
    /// The function determines whether the current operating system is a 
    /// 64-bit operating system.
    /// </summary>
    /// <returns>
    /// The function returns true if the operating system is 64-bit; 
    /// otherwise, it returns false.
    /// </returns>
    public static bool Is64BitOperatingSystem()
    {
        if (IntPtr.Size == 8)  // 64-bit programs run only on Win64
        {
            return true;
        }
        else  // 32-bit programs run on both 32-bit and 64-bit Windows
        {
            // Detect whether the current process is a 32-bit process 
            // running on a 64-bit system.
            bool flag;
            return ((DoesWin32MethodExist("kernel32.dll", "IsWow64Process") &&
                IsWow64Process(GetCurrentProcess(), out flag)) && flag);
        }
    }

    /// <summary>
    /// The function determins whether a method exists in the export 
    /// table of a certain module.
    /// </summary>
    /// <param name="moduleName">The name of the module</param>
    /// <param name="methodName">The name of the method</param>
    /// <returns>
    /// The function returns true if the method specified by methodName 
    /// exists in the export table of the module specified by moduleName.
    /// </returns>
    static bool DoesWin32MethodExist(string moduleName, string methodName)
    {
        IntPtr moduleHandle = GetModuleHandle(moduleName);
        if (moduleHandle == IntPtr.Zero)
        {
            return false;
        }
        return (GetProcAddress(moduleHandle, methodName) != IntPtr.Zero);
    }

    [DllImport("kernel32.dll")]
    static extern IntPtr GetCurrentProcess();

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    static extern IntPtr GetModuleHandle(string moduleName);

    [DllImport("kernel32", CharSet = CharSet.Auto, SetLastError = true)]
    static extern IntPtr GetProcAddress(IntPtr hModule,
        [MarshalAs(UnmanagedType.LPStr)]string procName);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool IsWow64Process(IntPtr hProcess, out bool wow64Process);

원격 시스템을 테스트하기위한 WMI 버전도 있습니다.


1
이 코드는 Microsoft Public License에 따라 라이센스가 부여됩니다 .
ladenedge

관리되는 .net이없는 WMI 버전? 나는 그것을 지금까지 찾지 못했습니다
JohnZaj

16

당신은 또한 확인할 수 있습니다 PROCESSOR_ARCHITECTURE환경 변수를 .

존재하지 않거나 32 비트 Windows에서 "x86"으로 설정되어 있습니다.

private int GetOSArchitecture()
{
    string pa = 
        Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE");
    return ((String.IsNullOrEmpty(pa) || 
             String.Compare(pa, 0, "x86", 0, 3, true) == 0) ? 32 : 64);
}

1
64 비트 프로세서를 사용한다고해서 64 비트 OS가 있다는 의미는 아닙니다.
David

2
@David Windows의 프로세서 아키텍처를보고합니다. CPU가 아닙니다. 이 페이지의 "코드"에서 시작하는 자세한 설명을 참조하십시오. andrewensley.com/2009/06/c-detect-windows-os-part-1
Andrew Ensley

이것을 실행하면 2 센트를 추가하기 만하면 앱이 다음 prefer 32-bitAny CPU같이 구성 되지만 얻을 수는 없습니다 . Platform Targetx86Prefer 32-bitAMD64
XAMlMAX

14

Chriz Yuen 블로그에서

C # .Net 4.0 2 개의 새로운 환경 속성 인 Environment.Is64BitOperatingSystem을 도입했습니다. Environment.Is64BitProcess;

이 두 속성을 모두 사용할 때는주의하십시오. Windows 7 64 비트 시스템에서 테스트

//Workspace: Target Platform x86
Environment.Is64BitOperatingSystem True
Environment.Is64BitProcess False

//Workspace: Target Platform x64
Environment.Is64BitOperatingSystem True
Environment.Is64BitProcess True

//Workspace: Target Platform Any
Environment.Is64BitOperatingSystem True
Environment.Is64BitProcess True

12

가장 빠른 방법 :

if(IntPtr.Size == 8) {
    // 64 bit machine
} else if(IntPtr.Size == 4)  {
    // 32 bit machine
} 

참고 : 이것은 매우 직접적이며 프로그램이 32 비트 프로세스 (예 :<Prefer32Bit>true</Prefer32Bit>프로젝트 설정)에서강제로 실행되지 않는 경우에만 64 비트에서 올바르게 작동합니다.


32
64 비트 Windows의 32 비트 .NET Framework 2.0에서 실행중인 경우 32 비트를 반환합니다.
Stefan Schultze

이 상황을 잊어 버렸습니다. 이것을 언급하기 위해 질문을 편집했습니다. 고마워 stefan-mg.
Marc

1
이것은 정확하지 않습니다. 플랫폼은 64 비트 일 수 있지만 여전히 32 비트 모드로 실행 중입니다.
Sebastian Good

11

이 시도:

Environment.Is64BitOperatingSystem

Environment.Is64BitProcess

5
입력 해 주셔서 감사하지만이 솔루션이 이미 제공되어 있으므로 게시하기 전에 사용 가능한 답변을 읽으십시오. 또한 원래 질문은 .net 4에만 도입 된이 두 속성이없는 .net 2에 관한 것입니다.
Marc

9

@ foobar : 당신이 맞아요, 너무 쉽습니다;)

99 %의 경우, 시스템 관리자가 약한 개발자는 누구나 Windows를 열거 할 수 있도록 Microsoft가 항상 제공 한 힘을 깨닫지 못합니다.

시스템 관리자는 그런 점에서 항상 더 좋고 간단한 코드를 작성합니다.

그럼에도 불구하고, 이 환경 변수가 올바른 시스템에서 올바른 값을 리턴하려면 빌드 구성이 AnyCPU 여야합니다 .

System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")

32 비트 Windows에서는 "X86", 64 비트 Windows에서는 "AMD64"를 반환합니다.


4
솔루션은 Widows 7 Ultimate 파티션으로 Bootcamp를 실행하는 Intel i7-3720QM 마이크로 프로세서가 장착 된 MacBook Pro에서 x86을 반환합니다. Stefan Schultze의 솔루션 프로세서를 64 비트로 식별했습니다. 솔루션이 Windows 기반 PC의 99 %에서 작동한다고 확신합니다. 시도 +1
Mark Kram

아니. Windows 7 pro, 64 비트 운영 체제에서 "x86"을 반환했습니다.
Hagai L 2016

7

사용 dotPeek를 하면 프레임 워크가 실제로 어떻게 작동하는지 확인할 수 있습니다. 그것을 염두에두고, 내가 생각해 낸 것은 다음과 같습니다.

public static class EnvironmentHelper
{
    [DllImport("kernel32.dll")]
    static extern IntPtr GetCurrentProcess();

    [DllImport("kernel32.dll")]
    static extern IntPtr GetModuleHandle(string moduleName);

    [DllImport("kernel32")]
    static extern IntPtr GetProcAddress(IntPtr hModule, string procName);

    [DllImport("kernel32.dll")]
    static extern bool IsWow64Process(IntPtr hProcess, out bool wow64Process);

    public static bool Is64BitOperatingSystem()
    {
        // Check if this process is natively an x64 process. If it is, it will only run on x64 environments, thus, the environment must be x64.
        if (IntPtr.Size == 8)
            return true;
        // Check if this process is an x86 process running on an x64 environment.
        IntPtr moduleHandle = GetModuleHandle("kernel32");
        if (moduleHandle != IntPtr.Zero)
        {
            IntPtr processAddress = GetProcAddress(moduleHandle, "IsWow64Process");
            if (processAddress != IntPtr.Zero)
            {
                bool result;
                if (IsWow64Process(GetCurrentProcess(), out result) && result)
                    return true;
            }
        }
        // The environment must be an x86 environment.
        return false;
    }
}

사용법 예 :

EnvironmentHelper.Is64BitOperatingSystem();

6

다음 두 가지 환경 변수 (의사 코드)를 사용하십시오.

if (PROCESSOR_ARCHITECTURE = x86 &&
    isDefined(PROCESSOR_ARCHITEW6432) &&
    PROCESSOR_ARCHITEW6432 = AMD64) {

    //64 bit OS
}
else
    if (PROCESSOR_ARCHITECTURE = AMD64) {
        //64 bit OS
    }
    else
        if (PROCESSOR_ARCHITECTURE = x86) {
            //32 bit OS
        }

블로그 게시물 HOWTO : Detect Process Bitness를 참조하십시오 .


C / C ++가 아니라 .NET에 대한 질문이있는 부분을 보았습니까? 그리고 이것은 컴파일 시간 대 런타임 검사입니다. 또한 코드는 비교가 아닌 할당을 수행합니다.
dvallejo

이 코드는 .NET (2.0에서 테스트)에서 작동합니다. 환경 변수는 다음을 통해 액세스 할 수 있습니다. Environment.GetEnvironmentVariable ( "PROCESSOR_ARCHITECTURE"); Environment.GetEnvironmentVariable ( "PROCESSOR_ARCHITEW6432");
andrew.fox

5

많은 운영 체제에서이 검사를 성공적으로 사용했습니다.

private bool Is64BitSystem
{
   get
   {
      return Directory.Exists(Environment.ExpandEnvironmentVariables(@"%windir%\SysWOW64"));
   }
}

이 폴더의 이름은 운영 체제 언어에 관계없이 항상 "SysWOW64"입니다. .NET Framework 1.1 이상에서 작동합니다.


그리고라는 폴더 생성에서 관리 권한을 가진 사용자로 저를 어떻게 방지 SysWOW64켜짐을 %windir%32 비트 OS에? 폴더가 존재한다는 것은 폴더가 존재한다는 것을 의미합니다.
cogumel0

사용자가 이러한 폴더를 의도적으로 만들 가능성은 무엇입니까? 이것은 운영 체제가 x64인지 확인하는 다른 방법입니다.
Alexandru Dicu

컴퓨터가 바이러스에 감염 될 가능성은 무엇입니까? 가능성은 매우 낮으므로 보호 기능을 설치하지 않는 것이 좋습니다. 프로그래밍은 고의로 실패 할 가능성이 낮은 것을 만드는 것이 아닙니다 . 그것은 무의식적으로 실패 할 가능성이 낮은 것을 만들고 수정하는 것입니다. 첫 번째는 나쁜 프로그래밍 / 나쁜 구현이라고하고 두 번째는 버그라고합니다.
cogumel0

@AlexandruDicu이 접근법은 100 % 정확하지 않으며 타사 응용 프로그램이나 사용자가 수동으로 폴더를 만들 때 오류가 발생할 위험이 있음을 언급해야합니다.
Rajesh Mishra

4

나는 이것을해야하지만 관리자가 원격으로 할 수 있어야합니다. 어쨌든 이것은 나에게 아주 잘 작동하는 것 같습니다.

    public static bool is64bit(String host)
    {
        using (var reg = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, host))
        using (var key = reg.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\"))
        {
            return key.GetValue("ProgramFilesDir (x86)") !=null;
        }
    }

4

이것은 http://1code.codeplex.com/SourceControl/changeset/view/39074#842775 의 Microsoft 코드를 기반으로 한 솔루션입니다. . 쉬운 코드 재사용을 위해 확장 방법을 사용합니다.

가능한 사용법은 다음과 같습니다.

bool bIs64BitOS = System.Environment.OSVersion.IsWin64BitOS();

bool bIs64BitProc = System.Diagnostics.Process.GetCurrentProcess().Is64BitProc();

//Hosts the extension methods  
public static class OSHelperTools  
{  
    /// <summary>     
    /// The function determines whether the current operating system is a      
    /// 64-bit operating system.     
    /// </summary>     
    /// <returns>     
    /// The function returns true if the operating system is 64-bit;      
    /// otherwise, it returns false.     
    /// </returns>    
    public static bool IsWin64BitOS(this OperatingSystem os)  
    {  
        if (IntPtr.Size == 8)  
        // 64-bit programs run only on Win64           
            return true;   
        else// 32-bit programs run on both 32-bit and 64-bit Windows     
        {   // Detect whether the current process is a 32-bit process                
            // running on a 64-bit system.               
            return Process.GetCurrentProcess().Is64BitProc();  
        }  
    }  

    /// <summary>  
    /// Checks if the process is 64 bit  
    /// </summary>  
    /// <param name="os"></param>  
    /// <returns>  
    /// The function returns true if the process is 64-bit;        
    /// otherwise, it returns false.  
    /// </returns>    
    public static bool Is64BitProc(this System.Diagnostics.Process p)  
    {  
        // 32-bit programs run on both 32-bit and 64-bit Windows           
        // Detect whether the current process is a 32-bit process                
        // running on a 64-bit system.               
        bool result;  
        return ((DoesWin32MethodExist("kernel32.dll", "IsWow64Process") && IsWow64Process(p.Handle, out result)) && result);  
    }  

    /// <summary>     
    /// The function determins whether a method exists in the export      
    /// table of a certain module.     
    /// </summary>     
    /// <param name="moduleName">The name of the module</param>     
    /// <param name="methodName">The name of the method</param>     
    /// <returns>     
    /// The function returns true if the method specified by methodName      
    /// exists in the export table of the module specified by moduleName.     
    /// </returns>       
    static bool DoesWin32MethodExist(string moduleName, string methodName)  
    {  
        IntPtr moduleHandle = GetModuleHandle(moduleName);  
        if (moduleHandle == IntPtr.Zero)  
            return false;    
        return (GetProcAddress(moduleHandle, methodName) != IntPtr.Zero);   
    }  
    [DllImport("kernel32.dll")]  
    static extern IntPtr GetCurrentProcess();  

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]  
    static extern IntPtr GetModuleHandle(string moduleName);  

    [DllImport("kernel32", CharSet = CharSet.Auto, SetLastError = true)]  
    static extern IntPtr GetProcAddress(IntPtr hModule, [MarshalAs(UnmanagedType.LPStr)]string procName);  

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]  
    [return: MarshalAs(UnmanagedType.Bool)]  
    static extern bool IsWow64Process(IntPtr hProcess, out bool wow64Process);  
}

CodePlex 링크가 끊어진 것 같습니다.
피터 Mortensen

3

이 페이지 에서 DllImport를 사용하는 C #의 직접적인 접근 방식은 다음과 같습니다 .

[DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)] 
[return: MarshalAs(UnmanagedType.Bool)] 
public static extern bool IsWow64Process([In] IntPtr hProcess, [Out] out bool lpSystemInfo); 

public static bool Is64Bit() 
{ 
    bool retVal; 

    IsWow64Process(Process.GetCurrentProcess().Handle, out retVal); 

    return retVal; 
} 

여전히 포인터 크기를 먼저 확인해야합니다. 그렇지 않으면 64 비트 시스템에서 32 비트 프로세스인지 확인합니다
Bruno Lopes

1
IsWow64Process존재하지 않기 때문에 이전 OS에서도 충돌이 발생 합니다.
다항식

3

다음 코드를 사용하고 있습니다. 참고 : AnyCPU 프로젝트 용으로 제작되었습니다.

    public static bool Is32bitProcess(Process proc) {
        if (!IsThis64bitProcess()) return true; // We're in 32-bit mode, so all are 32-bit.

        foreach (ProcessModule module in proc.Modules) {
            try {
                string fname = Path.GetFileName(module.FileName).ToLowerInvariant();
                if (fname.Contains("wow64")) {
                    return true;
                }
            } catch {
                // What on earth is going on here?
            }
        }
        return false;
    }

    public static bool Is64bitProcess(Process proc) {
        return !Is32bitProcess(proc);
    }

    public static bool IsThis64bitProcess() {
        return (IntPtr.Size == 8);
    }

2

이것이 시스템의 플랫폼과 프로세스를 확인하는 가장 좋은 방법이라는 것을 알았습니다.

bool 64BitSystem = Environment.Is64BitOperatingSystem;
bool 64BitProcess = Environment.Is64BitProcess;

첫 번째 속성은 64 비트 시스템의 경우 true를, 32 비트의 경우 false를 반환합니다. 두 번째 속성은 64 비트 프로세스의 경우 true를, 32 비트의 경우 false를 반환합니다.

이 두 가지 특성은 64 비트 시스템에서 32 비트 프로세스를 실행할 수 있으므로 시스템과 프로세스를 모두 확인해야하기 때문에 필요합니다.


1
c #에서 빌드하려면 변수 이름 앞에 _ 또는 문자를 넣으십시오 (변수 이름은 내 생각에 따라 C #의 숫자로 시작하지 않습니다!)
Chris

2

괜찮아요, 그러나 이것은 또한 다음에서 작동해야합니다 env:

PROCESSOR_ARCHITECTURE=x86

..

PROCESSOR_ARCHITECTURE=AMD64

어쩌면 ;-)


2

여기의 Windows 관리 계측 (WMI) 접근 방법 :

string _osVersion = "";
string _osServicePack = "";
string _osArchitecture = "";

ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_OperatingSystem");
ManagementObjectCollection collection = searcher.Get();

foreach (ManagementObject mbo in collection)
{
    _osVersion = mbo.GetPropertyValue("Caption").ToString();
    _osServicePack = string.Format("{0}.{1}", mbo.GetPropertyValue("ServicePackMajorVersion").ToString(), mbo.GetPropertyValue("ServicePackMinorVersion").ToString());

    try
    {
        _osArchitecture = mbo.GetPropertyValue("OSArchitecture").ToString();
    }
    catch
    {
        // OSArchitecture only supported on Windows 7/Windows Server 2008
    }
}

Console.WriteLine("osVersion     : " + _osVersion);
Console.WriteLine("osServicePack : " + _osServicePack);
Console.WriteLine("osArchitecture: " + _osArchitecture);

/////////////////////////////////////////
// Test on Windows 7 64-bit
//
// osVersion     : Microsoft Windows 7 Professional
// osservicePack : 1.0
// osArchitecture: 64-bit

/////////////////////////////////////////
// Test on Windows Server 2008 64-bit
//    --The extra r's come from the registered trademark
//
// osVersion     : Microsoftr Windows Serverr 2008 Standard
// osServicePack : 1.0
// osArchitecture: 64-bit

/////////////////////////////////////////
// Test on Windows Server 2003 32-bit
//    --OSArchitecture property not supported on W2K3
//
// osVersion     : Microsoft(R) Windows(R) Server 2003, Standard Edition
// osServicePack : 2.0
// osArchitecture:

1

OSInfo. 비트

using System;
namespace CSharp411
{
    class Program
    {
        static void Main( string[] args )
        {
           Console.WriteLine( "Operation System Information" );
           Console.WriteLine( "----------------------------" );
           Console.WriteLine( "Name = {0}", OSInfo.Name );
           Console.WriteLine( "Edition = {0}", OSInfo.Edition );
           Console.WriteLine( "Service Pack = {0}", OSInfo.ServicePack );
           Console.WriteLine( "Version = {0}", OSInfo.VersionString );
           Console.WriteLine( "Bits = {0}", OSInfo.Bits );
           Console.ReadLine();
        }
    }
}

3
모두 훌륭하지만이 클래스는 Microsoft WSUS 인 Microsoft.UpdateServices.Administration 네임 스페이스의 클래스입니다. 플랫폼 비트를 알기 위해이 참조를 포함하고 싶지 않습니다.
Marc

"C : \ Program Files \ Microsoft.NET \ SDK \ v2.0 64 비트 \ LateBreaking \ PlatformInvoke \ WinAPIs \ OSInfo \ CS \ OSInfoCS.sln"
AMissico

1

다음 코드를 프로젝트의 클래스에 포함하십시오.

    [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 int GetBit()
    {
        int MethodResult = "";
        try
        {
            int Architecture = 32;

            if ((Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor >= 1) || Environment.OSVersion.Version.Major >= 6)
            {
                using (Process p = Process.GetCurrentProcess())
                {
                    bool Is64Bit;

                    if (IsWow64Process(p.Handle, out Is64Bit))
                    {
                        if (Is64Bit)
                        {
                            Architecture = 64;

                        }

                    }

                }

            }

            MethodResult = Architecture;

        }
        catch //(Exception ex)
        {
            //ex.HandleException();
        }
        return MethodResult;
    }

다음과 같이 사용하십시오.

string Architecture = "This is a " + GetBit() + "bit machine";

0

설치된 Windows 아키텍처를 얻으려면 이것을 사용하십시오.

string getOSArchitecture()
{
    string architectureStr;
    if (Directory.Exists(Environment.GetFolderPath(
                           Environment.SpecialFolder.ProgramFilesX86))) {
        architectureStr ="64-bit";
    }
    else {
        architectureStr = "32-bit";
    }
    return architectureStr;
}

w7x64 vs.net 2010에는 ProgramFilesX86 속성이 없습니다.
Christian Casutt

0

수락 된 답변이 매우 복잡하다는 것을 감안할 때. 더 간단한 방법이 있습니다. 광산은 alexandrudicu의 anaswer의 변형입니다. 64 비트 Windows가 Program Files (x86)에 32 비트 응용 프로그램을 설치하면 환경 변수를 사용하여 해당 폴더가 존재하는지 확인할 수 있습니다 (다른 지역화를 보완하기 위해).

예 :

private bool Is64BitSystem
{
   get
   {
      return Directory.Exists(Environment.ExpandEnvironmentVariables(@"%PROGRAMFILES(X86)%"));
   }
}

이것은 나를 위해 더 빠르고 간단합니다. OS 버전에 따라 해당 폴더 아래의 특정 경로에 액세스하고 싶습니다.


2
허용되는 답변은 .NET 2.0이었습니다. .NET 4.0 이상인 경우 대부분의 투표에서 답변을 찾을 수 있으므로 Environment.Is64BitOperatingSystem을 사용하십시오.
Marc

예, 내 .net 2.0도 있습니다.
John Demetriou

-2

즐겨 ;-)

Function Is64Bit() As Boolean

    Return My.Computer.FileSystem.SpecialDirectories.ProgramFiles.Contains("Program Files (x86)")

End Function

현지화 된 Windows 설치에서는 작동하지 않으므로 -1입니다. 그리고 VB.net을 사용하지만 질문은 C #으로 태그 지정됩니다.
Marc

-3

"C : \ Program Files (x86)"가 있는지 확인하십시오. 그렇지 않으면 32 비트 OS에있는 것입니다. 그렇다면 OS는 64 비트입니다 (Windows Vista 또는 Windows 7). 충분히 간단 해 보입니다 ...


5
하드 코딩하는 대신 Win32 API에서 올바른 현지화 된 디렉토리 이름을 검색하십시오.
Christian Hayter

나는 그것이 좋은 생각이라고 말하지만, 사용자가 어떤 모호한 이유로 이것을하지 않을 것이라고 가정 할 수는 없습니다.
GurdeepS

2
잘못 작성된 일부 응용 프로그램은 이제 아키텍처와 상관없이 "프로그램 파일 (x86)"에 직접 설치됩니다. 예를 들어 SOAPSonar 덕분에 32 비트 시스템에 해당 디렉토리가 있습니다.
ladenedge

-4

나는 사용한다:

Dim drivelet As String = Application.StartupPath.ToString
If Directory.Exists(drivelet(0) & ":\Program Files (x86)") Then
    MsgBox("64bit")
Else
    MsgBox("32bit")
End if

컴퓨터의 여러 위치에 응용 프로그램을 설치 한 경우 응용 프로그램이 시작되는 경로를 가져옵니다. 또한 C:\99.9 %의 컴퓨터가에 Windows가 설치되어 있기 때문에 일반적인 경로 를 사용할 수도 있습니다 C:\.


8
매우 나쁜 접근법. 나중에이 디렉토리의 이름이 바뀌면 어떻게됩니까? 지역화 된 버전의 Windows는 어떻습니까? Windows XP 독일어에서는 "프로그램 파일"을 "프로그램"이라고합니다. 확실하지 않지만 XP 64는 "Programme (x86)"이라고 부를 수 있습니다.
Marc

1
권장하지는 않지만 환경 변수를 확장하여 지역화 문제를 해결할 수 있습니다. var % ProgramFiles (x86) %
Matthew Lock

-7

다음 버전을 사용합니다.

    public static bool Is64BitSystem()
    {
        if (Directory.Exists(Environment.GetEnvironmentVariable("Program Files (x86)"))) return true;
        else return false;
    }

6
현지화 된 프로그램 폴더 이름으로 인해 영어 이외의 XP 버전에서는 작동하지 않습니다.
Daniel Schlößer

그러나 심지어 64 비트 시스템이 폴더 하하가
carefulnow1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.