C#中的.NET2.0框架检查64位操作系统是否有此功能?如果不这样做?更好的答案?
您好,我有一段我写的代码,检查文件夹是否存在(仅存在于x64中),如果存在,它执行“X”命令,如果不存在(即x86)执行“Z”命令(X,Z只是代码的标记),但我想知道的是,是否有更好或更可靠的方法仅使用2.0.net Framework来执行此操作C#中的.NET2.0框架检查64位操作系统是否有此功能?如果不这样做?更好的答案?,c#,64-bit,C#,64 Bit,您好,我有一段我写的代码,检查文件夹是否存在(仅存在于x64中),如果存在,它执行“X”命令,如果不存在(即x86)执行“Z”命令(X,Z只是代码的标记),但我想知道的是,是否有更好或更可靠的方法仅使用2.0.net Framework来执行此操作 string target = @"C:\Windows\SysWow64"; { if (Directory.Exists(target)) { //d
string target = @"C:\Windows\SysWow64";
{
if (Directory.Exists(target))
{
//do x64 stuff
}
else
{
//do x86 stuff
}
您可以使用IntPtr.Size属性。它的值是4表示32位,8表示64位。如果您喜欢文本
Console.WriteLine(System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE"));
这将返回x86或AMD64。您可以使用Reflector查看它在FW 4.0中的实现方式:
[DllImport("kernel32.dll", CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)]
private static extern IntPtr GetProcAddress(IntPtr hModule, string methodName);
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail), DllImport("kernel32.dll", CharSet=CharSet.Auto, SetLastError=true)]
private static extern IntPtr GetModuleHandle(string moduleName);
[DllImport("kernel32.dll", CharSet=CharSet.Auto, SetLastError=true)]
internal static extern IntPtr GetCurrentProcess();
[SecurityCritical]
internal static bool DoesWin32MethodExist(string moduleName, string methodName)
{
IntPtr moduleHandle = GetModuleHandle(moduleName);
if (moduleHandle == IntPtr.Zero)
{
return false;
}
return (GetProcAddress(moduleHandle, methodName) != IntPtr.Zero);
}
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("kernel32.dll", SetLastError=true)]
internal static extern bool IsWow64Process([In] IntPtr hSourceProcessHandle, [MarshalAs(UnmanagedType.Bool)] out bool isWow64);
[SecuritySafeCritical]
public static bool get_Is64BitOperatingSystem()
{
bool flag;
return (IntPtr.Size == 8) ||
((DoesWin32MethodExist("kernel32.dll", "IsWow64Process") &&
IsWow64Process(GetCurrentProcess(), out flag)) && flag);
}
它检查IsWow64Process()
函数是否存在,并调用它
更新:添加了get\u is64位操作系统()使用的所有函数。
更新2:修复了64位进程的问题您需要p/调用GetNativeSystemInfo():
查看SYSTEM_INFO.wProcessorArchitecture字段。以下内容都不是原始内容(我将尽我所能引用),但将有助于收集有关这种情况的信息 如果您使用的是.NET4或更高版本,请立即停止阅读。这是内置在框架中的(签出System.Environment.get\u is64bitoperatingsystem) 除此之外,我还遇到了很多选择 解决方案1:编译时指令 陈雷蒙的MSDN博客: 此解决方案的积分:@Thorarin指向dup。Stefan Schultze链接到本文的线程。不过,我不确定这条线是不是被骗了。作者明确表示,他正在检查操作系统平台。我不确定其目的是为了发现您的应用程序是在32位还是64位模式下运行 解决方案2:指针观察 对于这篇文章,我将遵从@Max,并添加以下MSDN文章以供额外阅读: 要知道的位:32位=4的指针大小,64位=8的指针大小 给那个人一分 解决方案3:使用WinAPI-AKA-To hell w/.Net,我会找到我自己强> 注意事项: 有一些黑客行为,比如查找“程序文件(x86)”,或者查看处理器体系结构标志。
这些方法的问题是
理想情况下,您不应该依赖外部指标,而应该在当前appdomain中寻找线索。我们希望所有的解决方案(只要可能)都是防爆炸的。您可以确定当前的操作系统是否为64位操作系统。 在.NET Framework 4中,有一个函数is64位操作系统可用于检查当前操作系统是否为64位操作系统
if (System.Environment.Is64BitOperatingSystem == true)
{
Response.Write("This is 64 Bit Operating System.");
}
else
{
Response.Write("This is not 64 Bit Operating System.");
}
在VB.NET中,我想要的如下所示 在x64所有配置(调试、发布等)中定义自定义常量“Win64”,如下图所示,并使用 如果是(Win64)那么 其他的 如果结束
我认为这将根据正在运行的.Net Framework版本返回正确的大小,而不是操作系统。如果在64位操作系统的32位框架上运行,它将返回4。它确定进程是32位还是64位,而不是操作系统。64位操作系统可以同时运行。的可能重复项不要假设Windows将始终安装到C:\Windows\文件夹。因此,我想如果我这样做是可以的:if(Directory.Exists(Environment.GetEnvironmentVariable(“SystemRoot”)+“\\SysWow64”)//在这种情况下,我们处理的64位操作系统
Win32Native
是一个内部类,而且,DoesWin32MethodExist
在.NET 4.0中似乎是新的。这个API告诉您的是32位应用程序是否在WOW64中运行。如果您将应用程序编译为64位操作系统上的AnyCPU,它应该作为64位应用程序运行,并且IsWow64()将返回false。谢谢。Reflector默认加载32位mscorlib.dll,因此不检查是否为64位进程。64位版本的mscorlib只需在get\u is64位操作系统()
中返回true
。更正了这种情况下的代码。这似乎适用于我的get_is64位操作系统();但这将如何用于IF x64然后this else then that?如何将其转换为“IF x64”do this else do that?这反映了处理器体系结构,而不是应用程序域的运行时状态。请参阅本帖中我文章的“注释”部分。你忘了那是一个.NET4.0属性吗?问题状态“仅使用2.0.net Framework”他要求的是.net 2.0环境。Is64BitOperatingSystem仅存在于4.0处理器体系结构中,不表示当前AppDomain的状态(即:64位系统上的32位运行时)
BOOL WINAPI IsWow64Process(
__in HANDLE hProcess,
__out PBOOL Wow64Process
);
if (System.Environment.Is64BitOperatingSystem == true)
{
Response.Write("This is 64 Bit Operating System.");
}
else
{
Response.Write("This is not 64 Bit Operating System.");
}
'64 bit code
' 32 bit code here