Как определить, является ли приложение .NET 32 или 64 бит?
У меня есть приложение .NET, которое должно быть скомпилировано как 32-разрядное приложение. Я подозреваю, что мой сервер сборки на самом деле не делает этого.
Как определить, действительно ли приложение .NET действительно запускается в 32-битном режиме?
Ответы
Ответ 1
Если вы пытаетесь проверить, работает ли работающее приложение в 32-разрядном или 64-битном режиме, откройте диспетчер задач и проверьте, есть ли у него звездочка (* 32 ) рядом с именем процесса.
Если у вас есть скомпилированная dll, и вы хотите проверить, скомпилирована ли она для 32-разрядного или 64-битного режима, выполните следующие действия (из связанный с этим вопрос). Я бы подумал, что вы хотите, чтобы вы скомпилировали dll для AnyCPU.
Откройте командную строку Visual Studio и введите "corflags [ваша сборка]". Вы получите что-то вроде этого:
c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC>corflags "C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Data.dll"
Microsoft (R) .NET Framework CorFlags Conversion Tool. Version 3.5.21022.8 Copyright (c) Microsoft Corporation. All rights reserved.
Version : v2.0.50727
CLR Header: 2.5
PE : PE32
CorFlags : 24
ILONLY : 0
32BIT : 0
Signed : 1
Вы смотрите на PE и 32BIT.
AnyCPU:
PE: PE32
32BIT: 0
x86:
PE: PE32
32BIT: 1
64:
PE: PE32 +
32BIT: 0
Ответ 2
Чтобы сделать это во время выполнения...
Вы можете оценить IntPtr.Size. Если IntPtr.Size == 4, то это 32 бит (4 x 8). Если IntPtr.Size == 8, то это бит 64 бит (8 x 8)
Ответ 3
Самый быстрый способ, вероятно, в том, что он будет иметь звездочку (*) после ее имени в диспетчере задач при запуске на 64-битной машине. Звездочка означает, что он работает в syswow64, а ergo - 32 бит.
Другой способ - запустить corflags.exe против него, и на этом отобразится ответ, который вам нужен. Это происходит с .NET SDK.
Ответ 4
Хорошо, если вы используете .NET 4.0, System.Environment.Is64BitProcess
.
Ответ 5
Я использую следующий код:
[DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool IsWow64Process(
[In] IntPtr hProcess,
[Out] out bool wow64Process
);
С
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;
}
}
Вы можете передать Process.CurrentProcess или аналогично этому.
Ответ 6
Если вы хотите протестировать сборку не программно, вы можете использовать corflags.exe
>corflags.exe <assembly>
<listing of header information, among them the 32bit-ness>