■ LoadLibrary/GetProcAddress WIN32 API 함수를 사용해 64비트 운영 체제 여부를 구하는 방법을 보여준다.
▶ Program.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
using System.Diagnostics; using System.Runtime.InteropServices; namespace TestProject; /// <summary> /// 프로그램 /// </summary> class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Delegate ////////////////////////////////////////////////////////////////////////////////////////// Private #region WOW 64비트 프로세스 여부 대리자 - IsWOW64ProcessDelegate(processHandle, isWOW64BitProcess) /// <summary> /// WOW 64비트 프로세스 여부 대리자 /// </summary> /// <param name="processHandle">프로세스 핸들</param> /// <param name="isWOW64BitProcess">WOW 64비트 프로세스 여부</param> /// <returns>WOW 64비트 프로세스 여부</returns> private delegate bool IsWOW64ProcessDelegate([In] IntPtr processHandle, [Out] out bool isWOW64BitProcess); #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Import ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 라이브러리 로드하기 - LoadLibrary(filePath) /// <summary> /// 라이브러리 로드하기 /// </summary> /// <param name="filePath">파일 경로</param> /// <returns>처리 결과</returns> [DllImport("kernel32", SetLastError = true, CallingConvention = CallingConvention.Winapi)] private extern static IntPtr LoadLibrary(string filePath); #endregion #region 프로시저 주소 구하기 - GetProcAddress(moduleHandle, procedureName) /// <summary> /// 프로시저 주소 구하기 /// </summary> /// <param name="moduleHandle">모듈 핸들</param> /// <param name="procedureName">프로시저명</param> /// <returns>프로시저 핸들</returns> [DllImport("kernel32", SetLastError = true, CallingConvention = CallingConvention.Winapi)] private extern static IntPtr GetProcAddress(IntPtr moduleHandle, string procedureName); #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region WOW 64비트 프로세스 여부 대리자 구하기 - GetIsWOW64ProcessDelegate() /// <summary> /// WOW 64비트 프로세스 여부 대리자 구하기 /// </summary> /// <returns>WOW 64비트 프로세스 여부 대리자</returns> private static IsWOW64ProcessDelegate GetIsWOW64ProcessDelegate() { IntPtr moduleHandle = LoadLibrary("kernel32"); if(moduleHandle != IntPtr.Zero) { IntPtr procedureHandle = GetProcAddress(moduleHandle, "IsWow64Process"); if(procedureHandle != IntPtr.Zero) { return (IsWOW64ProcessDelegate)Marshal.GetDelegateForFunctionPointer ( procedureHandle, typeof(IsWOW64ProcessDelegate) ); } } return null; } #endregion #region 64비트 프로세스 상에서 32비트 프로세스 여부 구하기 - Is32BitProcessOn64BitProcessor() /// <summary> /// 64비트 프로세스 상에서 32비트 프로세스 여부 구하기 /// </summary> /// <returns>64비트 프로세스 상에서 32비트 프로세스 여부</returns> private static bool Is32BitProcessOn64BitProcessor() { IsWOW64ProcessDelegate isWOW64ProcessDelegate = GetIsWOW64ProcessDelegate(); if(isWOW64ProcessDelegate == null) { return false; } bool isWOW64BitProcess; bool result = isWOW64ProcessDelegate.Invoke(Process.GetCurrentProcess().Handle, out isWOW64BitProcess); if(result == false) { return false; } return isWOW64BitProcess; } #endregion #region 64비트 운영 체제 여부 구하기 - Is64BitOperatingSystem() /// <summary> /// 64비트 운영 체제 여부 구하기 /// </summary> /// <returns>64비트 운영 체제 여부</returns> private static bool Is64BitOperatingSystem() { if(IntPtr.Size == 8 || (IntPtr.Size == 4 && Is32BitProcessOn64BitProcessor())) { return true; } else { return false; } } #endregion #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { Console.WriteLine($"64비트 운영 체제 여부 : {Is64BitOperatingSystem()}"); } #endregion } |