C#中的.NET2.0框架检查64位操作系统是否有此功能?如果不这样做?更好的答案?

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

您好,我有一段我写的代码,检查文件夹是否存在(仅存在于x64中),如果存在,它执行“X”命令,如果不存在(即x86)执行“Z”命令(X,Z只是代码的标记),但我想知道的是,是否有更好或更可靠的方法仅使用2.0.net Framework来执行此操作

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)”,或者查看处理器体系结构标志。
这些方法的问题是

  • 它们依赖于“自定义”安装中可能不存在的公用文件夹名称
  • 处理器的x64标志并不总是反映您当前的运行时状态。您是否保证为“任何CPU”进行编译?在64位处理器上运行32位操作系统?等等

  • 理想情况下,您不应该依赖外部指标,而应该在当前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