How to detect Windows 64-bit platform with .NET?

前端 未结 29 3236
野性不改
野性不改 2020-11-22 04:53

In a .NET 2.0 C# application I use the following code to detect the operating system platform:

string os_platform = System.Environment.OSVersion.Platform.ToS         


        
29条回答
  •  野性不改
    2020-11-22 05:31

    This is a solution based on Microsoft's code at http://1code.codeplex.com/SourceControl/changeset/view/39074#842775. It uses extension methods for easy code reuse.

    Some possible usage is shown below:

    bool bIs64BitOS = System.Environment.OSVersion.IsWin64BitOS();
    
    bool bIs64BitProc = System.Diagnostics.Process.GetCurrentProcess().Is64BitProc();
    
    //Hosts the extension methods  
    public static class OSHelperTools  
    {  
        ///      
        /// The function determines whether the current operating system is a      
        /// 64-bit operating system.     
        ///      
        ///      
        /// The function returns true if the operating system is 64-bit;      
        /// otherwise, it returns false.     
        ///     
        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();  
            }  
        }  
    
        ///   
        /// Checks if the process is 64 bit  
        ///   
        ///   
        ///   
        /// The function returns true if the process is 64-bit;        
        /// otherwise, it returns false.  
        ///     
        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);  
        }  
    
        ///      
        /// The function determins whether a method exists in the export      
        /// table of a certain module.     
        ///      
        /// The name of the module     
        /// The name of the method     
        ///      
        /// The function returns true if the method specified by methodName      
        /// exists in the export table of the module specified by moduleName.     
        ///        
        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);  
    }
    

提交回复
热议问题