繁体   English   中英

文件被复制到 SysWOW64 而不是 System32

[英]File getting copied to SysWOW64 instead of System32

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

当我在 destFile 上放置断点时,路径显示为C:\Windows\System32但文件不在其中(转到 sysWow64)go。 我试过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 位操作系统上运行。
基本上,它应该只将文件复制到System32而不管它是什么位操作系统。
在程序的后面,我必须通过命令行访问 psTools 实用程序,如果我将它放在 SysWOW64 中,则该实用程序不可用。 如果我进行更改,使用 SysWOW64 的 32 位 cmd.exe,这将再次成为特定于 64 位平台的东西,我不想选择它。

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

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

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

首先,确保您的程序确实属于 64 位系统文件夹 Windows 出于某种原因执行此自动重定向。 32 位版本的 Windows 的 64 位版本上的%windir%\System32文件夹中没有 go

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

我有同样的问题。 解决方案是在 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));

在此处输入图像描述

我在我的 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);
    }
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM