我有一个.NET应用程序,原本应该只编译为32位应用程序。我怀疑我的构建服务器实际上并没有这样做。
我该如何确定一个.NET应用程序是否真正设置为以32位模式运行?
我有一个.NET应用程序,原本应该只编译为32位应用程序。我怀疑我的构建服务器实际上并没有这样做。
我该如何确定一个.NET应用程序是否真正设置为以32位模式运行?
PE: PE32
32位: 0
x86:
PE: PE32
32位: 1
x64:
PE: PE32+
32位: 0
在运行时进行如下操作...
您可以评估 IntPtr.Size
。如果 IntPtr.Size == 4
,则是32位(4 x 8)。如果 IntPtr.Size == 8
,则是64位(8 x 8)。
如果您使用的是.NET 4.0,那么可以使用System.Environment.Is64BitProcess
。
sizeof(IntPtr)
是不合法的。 - Dan Tao最快的方法可能是在64位机器上运行时,在任务管理器中它的名称后面会有一个星号(*)。星号表示它正在syswow64中运行,因此被标记为32位。
另一种方法是运行corflags.exe并显示你想要的答案。这个工具随着.NET SDK一起提供。
[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;
}
}
这是对2010年旧的被接受答案的更新:
corflags <path/to/your/exe_or_dll_file>
。corflags
的输出已更改,现在看起来像这样:
Version : v4.0.30319
CLR Header: 2.5
PE : PE32
CorFlags : 0x3
ILONLY : 1
32BITREQ : 1
32BITPREF : 0
Signed : 0
32BITREQ
,意思是“需要32位”。如果您使用 Any CPU 构建但链接到32位本机DLL,则将其设置为1。这意味着您的DLL或EXE实际上是“ 32位(仅限)”,例如,无法在64位IIS应用程序池中运行。Version : v4.0.30319
CLR Header: 2.5
PE : PE32+
CorFlags : 0x1
ILONLY : 1
32BITREQ : 0
32BITPREF : 0
Signed : 0
字符串PE+
表示该DLL是为x64构建的。对于x86或Any CPU,它是PE32
。
如果你想非编程方式测试一个程序集,可以使用 corflags.exe
>corflags.exe <assembly>
<listing of header information, among them the 32bit-ness>
我正在寻找同样的信息,我发现自从Windows 8.1以来,就不再有星号了。
你有一个任务管理器详细信息列名为“平台”。它的内容是“32位”或“64位”。