我有一个.NET应用程序,应该被编译为32位应用程序。我怀疑我的构建服务器实际上并没有这样做。
如何确定.NET应用程序是否实际设置为以32位模式运行?
答案 0 :(得分:45)
如果您正在尝试检查正在运行的应用程序是否在32位或64位模式下运行,请打开任务管理器并检查它是否带有星号(* 32 )在流程名称旁边。
如果您有已编译的dll ,并且想要检查它是否已针对32位或64位模式进行编译,请执行以下操作(从related question开始)。 我认为你希望你能为AnyCPU编译。
打开Visual Studio命令提示符并键入“corflags [your assembly]”。你会得到这样的东西:
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 32位:086:
PE:PE32 32位:164:
PE:PE32 + 32位:0
答案 1 :(得分:19)
要在运行时执行此操作...
您可以评估IntPtr.Size
。如果IntPtr.Size == 4
那么它是32位(4 x 8)。如果IntPtr.Size == 8
那么它是64位(8 x 8)
答案 2 :(得分:8)
好吧,如果你使用的是.NET 4.0,那就是System.Environment.Is64BitProcess
。
答案 3 :(得分:7)
最快的方法可能是在64位计算机上运行时,它在任务管理器中的名称后面会有一个星号(*)。星号表示它在syswow64中运行,因为它标记为32位。
另一种方法是对它运行corflags.exe,这将显示你所追求的答案。这附带.NET SDK。
答案 4 :(得分:4)
我使用以下代码:
[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或类似的内容。
答案 5 :(得分:2)
如果要以编程方式非测试程序集,可以使用corflags.exe
>corflags.exe <assembly>
<listing of header information, among them the 32bit-ness>
答案 6 :(得分:1)
我正在搜索相同的信息,我发现自Windows 8.1以来,没有更多的星号。
您有一个名为&#34;平台&#34;的任务管理器详细信息列。它的内容是&#34; 32位&#34;或&#34; 64位&#34;。