我的应用程序运行时,我必须将psTool实用程序复制到System32文件夹
我在64位Windows 7上,每当我尝试通过File.Copy
将exe复制到system32位文件夹时,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位OS上都能正常工作。
基本上,它应该只设置将文件复制到System32
,而不管它是什么位操作系统。
在程序的后面,我必须通过命令行访问psTools实用程序,如果我将它放在SysWOW64中则不可用。如果我进行更改,使用SysWOW64的32位cmd.exe,这将再次是64位平台特定的,我不想选择。
任何可以让应用程序在32位和64位上运行而没有问题的解决方案?我是否必须修改代码(如何?)或者我是否必须修改此控制台应用程序项目的某些属性(哪些属性)?
答案 0 :(得分:26)
由于%windir%\System32
专门为64位应用程序保留,因此在64位版本的Windows上,尝试访问%windir%\System32
目录的32位应用程序会自动且透明地重定向到32位位%windir%\SysWOW64
目录。
首先,确保您的程序实际上属于64位系统文件夹。 Windows执行此自动重定向是有原因的。 32位内容不会出现在64位版本的Windows上的%windir%\System32
文件夹中。
如果您确定要将内容复制到64位系统目录中,则可以选择几种方法。最简单的可能是将您的实用程序编译为64位应用程序。或者,您可以告诉WOW64重定向器您知道自己在做什么,而不是使用%windir%\Sysnative
而不是%windir%\System32
来执行重定向。
答案 1 :(得分:6)
我遇到了同样的问题。解决方案是设置"平台目标"在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));
答案 2 :(得分:2)
由于路径环境变量在两个Windows x86 / x64版本上都包含c:\windows
,
为什么不将您的工具放入c:\windows
:%windir%
?
就我而言,这解决了我的问题。
答案 3 :(得分:2)
我在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);
}
}