文件被复制到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%
?
在我的情况下,这解决了我的问题。