Jonathan Allen
我有一个 .NET 应用程序,我觉得它现在是 32bit,但又不确定构建服务器是否真的帮我编译成了 32bit,请问我有什么办法可以检测当前的程序是否是真的 32bit ?
Jaco Pretorius
你想判断运行的应用程序是 32bit
还是 64bit
的话,方法有很多。
任务管理器
打开 windows 任务管理器,查看该进程名后面是否有 *32
字样,如果由此字样那就说明是 32bit应用程序,反之为 64bit。
Is64BitProcess属性
.NET 的 Environment 类提供了一个 Is64BitProcess
属性,你可以判断 true/false
来获取当前是否为 32bit/64bit 。
- //
- // Summary:
- // Gets a value that indicates whether the current process is a 64-bit process.
- //
- // Returns:
- // true if the process is 64-bit; otherwise, false.
- public static bool Is64BitProcess
- {
- get { }
- }
使用 win32 api
Win32 API 中提供了一个 IsWow64Process
方法,可以借助它实现,参考如下代码:
- [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
- [return: MarshalAs(UnmanagedType.Bool)]
- public static extern bool IsWow64Process(
- [In] IntPtr hProcess,
- [Out] out bool wow64Process
- );
-
接下来包装成一个可以判断 Process 的 IsProcess64()
方法。
- public static bool IsProcess64(Process process)
- {
- if ((Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor >= 1) || Environment.OSVersion.Version.Major >= 6) {
- bool ret_val;
-
- try {
- if (!WindowsAPI.IsWow64Process(process.Handle,out ret_val)) ret_val = false;
- } catch {
- ret_val = false;
- }
-
- if (!ret_val && IntPtr.Size == 8) {
- return true;
- } else {
- return false;
- }
- } else {
- return false;
- }
- }
-
使用 corflags.exe
corflags.exe 小工具可以配置和查询 应用程序 header 部分的 CorFlags 标记 从而知道你的程序是 32bit 还是 64bit。
具体参考MSDN连接:https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-2.0/ms164699(v=vs.80)?redirectedfrom=MSDN
IntPtr.Size
可以在程序运行来之后,判断 IntPtr.Size
的值,如何 IntPtr.Size == 4
的话,很显然是 32bit,如何 IntPtr.Size == 8
说明当前是 64bit。
其实判断方法有很多,看应用程序的 PE 头是个好办法,或者通过工具查看下进程的内存地址的长度来判断32还是64bit。