【问题标题】:Getting syswow64 directory using 32-bit application使用 32 位应用程序获取 syswow64 目录
【发布时间】:2010-08-22 09:31:23
【问题描述】:

我正在尝试在系统目录中查找文件。 问题是在使用时

Environment.SystemDirectory

在 x64 机器上,我仍然获得 System32 目录,而不是 Systemwow64 目录。

我需要在 x86 机器上获取“System32”目录,在 x64 上获取“SystemWow64”目录

有什么想法吗?

编辑: 为了找到 SysWow64,我使用了“GetSystemWow64Directory”。 (更多信息:pinvoke 请注意,在非 x64 机器上 - 结果为“0”。 希望这可以帮助某人

【问题讨论】:

标签: .net 64-bit environment-variables


【解决方案1】:

请改用Environment.GetFolderPath(Environment.SpecialFolder.SystemX86)

【讨论】:

  • 我的枚举中没有 SystemX86(只有“system”,它返回 system32 文件夹)。我在 .net 2.0 下
  • 如果您在 64 位机器上的 32 位进程中获得“System32”,听起来您关闭了 Windows 的文件系统重定向 (msdn.microsoft.com/en-us/library/aa384187(VS.85).aspx)。会是这样吗?您可以致电Wow64EnableWow64FsRedirection 以确保它已启用(请参阅msdn.microsoft.com/en-us/library/aa365744(VS.85).aspx)。
  • SystemX86 已添加到 .NET Framework 版本 4 中的 Environment.SpecialFolder 枚举中。见here
  • 以防万一不清楚,因为我不确定自己是否会在 64 位系统上切换到 SysWow64 位文件夹。由于 .SystemX86 扩展属性,我不确定,所以我对其进行了测试,它成功了!
【解决方案2】:

使用SHGetSpecialFolderPath函数:

[DllImport("shell32.dll")]
public static extern bool SHGetSpecialFolderPath(IntPtr hwndOwner, [Out]StringBuilder lpszPath, int nFolder, bool fCreate);

string GetSystemDirectory()
{
    StringBuilder path = new StringBuilder(260);
    SHGetSpecialFolderPath(IntPtr.Zero,path,0x0029,false);
    return path.ToString()
}

将在 x86 上返回 System32,在 x64 上返回 SysWow64

【讨论】:

    【解决方案3】:

    您的 32 位程序 认为 是 System32 真的是 SysWOW64 - 不要编写 32 位应用程序来明确了解 64 位,这就是 WOW64 重定向的用途

    【讨论】:

    • 没错。我只想获取默认的系统目录,但我总是获取system32目录
    • @Nissim:System32 是默认目录。它只是 32 位与 64 位进程中的不同位置。也许如果您说为什么您需要这些信息,我们或许可以提供更多帮助(即扩展您的问题)。
    • 我需要获取 IIS exe 以确定 IIS 版本。我通过定位文件并通过 FileVersionInfo 检索它的信息来做到这一点。但是当我使用 Path.Combine(Environment.SystemDirectory, @"inetsrv\inetinfo.exe") 我得到 FileNotFoundException。这不是一个关键问题,因为如果此测试失败,我将通过其他来源检索此信息,但仍然...
    • 你一直说你想要 SysWOW64,但我认为这就是你认为 64 位模块所在的位置。 Sys-WOW64 目录是 32 位模块所在的位置。您需要 64 位模块所在的 (Real) System32 文件夹。为此,请尝试 %SystemRoot%\SysNative。
    【解决方案4】:

    我遇到了同样的问题。解决方案是在 Visual Studio 的项目属性中将“平台目标”设置为 x86 而不是 AnyCPU 或 x64。在这种情况下,路径将是 "C:\Windows\system32" 但它实际上重定向到 "C:\Windows\SysWOW64" 您可以通过将任何文件放在“C:\Windows\SysWOW64”文件夹中来检查这一点,然后使用 File.Exists 命令检查是否找到文件在那个文件夹中:

    File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), sFileName));
    

    或者

    File.Exists(Path.Combine(Environment.SystemDirectory, sFileName));
    

    【讨论】:

    • 然后你将失去 64 位的所有优势...... touché
    猜你喜欢
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 2010-09-25
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多