文件被复制到SysWOW64而不是System32

时间:2012-04-11 05:36:45

标签: c# .net windows 64-bit 32bit-64bit

我的应用程序运行时,我必须将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位上运行而没有问题的解决方案?我是否必须修改代码(如何?)或者我是否必须修改此控制台应用程序项目的某些属性(哪些属性)?

4 个答案:

答案 0 :(得分:26)

你违反了file system redirection

由于%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));

enter image description here

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