文件被复制到SysWOW64而不是System32

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

当我在destFile上放置一个断点时,path显示为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); 

任何build议我在这里失踪?

编辑

正如答案中所指出的那样,正在发生文件系统redirect。 我正在使用64位操作系统上的控制台应用程序的Visual Studio的默认设置开发应用程序。 我不确定在编译时必须保留哪些设置/开关,以便应用程序可以在32位和64位操作系统上运行。
基本上,它应该只是设置将文件复制到System32而不pipe它是什么位的操作系统。
后来在程序中,我必须通过命令行访问psTools实用程序,如果我把它放在SysWOW64中,这个命令行是不可用的。 如果我进行更改,要使用SysWOW64的32位cmd.exe,这将再次是64位平台特定的,我不想select。

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

你已经违反了文件系统redirect 。

因为%windir%\System32专门用于64位应用程序,所以在64位版本的Windows上,尝试访问%windir%\System32目录的32位应用程序会自动并透明地redirect到32位%windir%\SysWOW64目录。

首先,确保你的程序确实属于64位系统文件夹 。 Windows做这个自动redirect的原因。 32位的东西不会在64位版本的Windows上的%windir%\System32文件夹中

如果您确定要将东西复制到64位系统目录中,则有几个选项。 最简单的方法就是把你的工具编译成一个64位的应用程序。 或者,您可以通过使用%windir%\Sysnative而不是%windir%\System32来告诉WOW64redirect程序您知道自己在做什么而不执行redirect。

我有同样的问题。 解决scheme是在Visual Studio的项目属性中将“平台目标”设置为x64或AnyCPU,而不是x86。 在这种情况下,path将是"C:\Windows\system32"并且不会redirect到"C:\Windows\SysWOW64"您可以通过将任何文件放在“C:\ Windows \ SysWOW64”文件夹中,然后使用File.Exists命令检查是否在该文件夹中find文件:

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

要么

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

在这里输入图像描述

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

 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); } } 

由于path environnementvariables在Windows x86 / x64版本上都包含c:\windows ,为什么不把工具放到c:\windows%windir%

在我的情况下,这解决了我的问题。