20

当我的应用程序运行时,我必须将 psTool 实用程序复制到 System32 文件夹。
我在 64 位 Windows 7 上,每当我尝试通过 将 exe 复制到 system32 位文件夹时File.Copy,exe 总是被复制到 SysWow64。

当我在 destFile 上放置断点时,路径显示为C:\Windows\System32但文件没有进入那里(进入 sysWow64)。我已经尝试过Special Folder SystemX86,但文件再次转到 sysWOW64。

string sourceFile = "C:\bin\Debug\somexe.exe"
string destFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), utilityName);
File.Copy(sourceFile, destFile, true);

有什么建议我在这里缺少吗?

编辑

正如下面答案中所指出的,发生了文件系统重定向。我正在使用 Visual Studio 的默认设置为 64 位操作系统上的控制台应用程序开发应用程序。我不确定在编译时必须保留哪些设置/开关,以便应用程序可以在 32 位和 64 位操作系统上运行。基本上,无论它是什么位操作系统
,它都应该只将文件复制设置为。 稍后在程序中,我必须通过命令行访问 psTools 实用程序,如果我将它放在 SysWOW64 中,则无法使用该实用程序。如果我进行更改,使用 SysWOW64 的 32 位 cmd.exe,这将再次成为 64 位平台特定的东西,我不想选择。System32


任何可以让应用程序在 32 位和 64 位上运行而没有问题的解决方案?我是否必须修改代码(如何?)还是必须修改此控制台应用程序项目的某些属性(哪些属性)?

4

4 回答 4

32

您与文件系统重定向发生冲突。

因为%windir%\System32专为 64 位应用程序保留,所以在 64 位版本的 Windows 上,尝试访问该%windir%\System32目录的 32 位应用程序会自动且透明地重定向到 32 位%windir%\SysWOW64目录。

首先,确保您的程序确实属于 64 位系统文件夹。Windows 执行此自动重定向是有原因的。32 位的东西不在%windir%\System3264 位版本的 Windows 上的文件夹中

如果您确定要将内容复制到 64 位系统目录中,您有几个选择。最简单的可能是将您的实用程序编译为 64 位应用程序。或者,您可以告诉 WOW64 重定向器您知道自己在做什么,而不是使用%windir%\Sysnative而不是执行重定向%windir%\System32

于 2012-04-11T05:42:04.493 回答
7

我有同样的问题。解决方案是在 Visual Studio 的项目属性中将“平台目标”设置为 x64 或 AnyCPU 而不是 x86。在这种情况下,路径将"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));

在此处输入图像描述

于 2014-04-27T18:59:22.343 回答
3

我在始终返回本机 system32 文件夹的 32 位应用程序中使用辅助属性。辅助属性是:

public static string NativeSystemPath
{
    get
    {
        if (Environment.Is64BitOperatingSystem)
        {
            return System.IO.Path.Combine(
                Environment.GetFolderPath(Environment.SpecialFolder.Windows),
                "Sysnative");
        }
        return Environment.GetFolderPath(Environment.SpecialFolder.System);
    }
}
于 2016-06-24T19:11:40.283 回答
2

由于路径环境变量包含c:\windows在两个 Windows x86/x64 版本上,为什么不将您的工具放入c:\windows: %windir%

就我而言,这解决了我的问题。

于 2013-02-07T09:42:30.473 回答