Подтвердить что ты не робот

Как определить, является ли приложение .NET 32 или 64 бит?

У меня есть приложение .NET, которое должно быть скомпилировано как 32-разрядное приложение. Я подозреваю, что мой сервер сборки на самом деле не делает этого.

Как определить, действительно ли приложение .NET действительно запускается в 32-битном режиме?

4b9b3361

Ответ 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.

Ответ 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>