20

アプリケーションの実行時に、psToolユーティリティをSystem32フォルダーにコピーする必要があります。
私は64ビットのWindows7を使用していますが、exeをsystem32ビットフォルダーにコピーしようとするとFile.Copy、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);

私がここで見逃している提案はありますか?

編集

以下の回答で指摘されているように、ファイルシステムのリダイレクトが行われています。64ビットOS上のコンソールアプリケーション用に、VisualStudioのデフォルト設定でアプリを開発しています。アプリケーションが32ビットと64ビットの両方のOSで動作するように、コンパイル中にどの設定/スイッチを保持する必要があるかわかりません。基本的には、 OSのビットに関係なく
、ファイルをコピーするように設定する必要があります。 プログラムの後半で、コマンドラインからpsToolsユーティリティにアクセスする必要がありますが、SysWOW64に配置すると使用できなくなります。SysWOW64の32ビットcmd.exeを使用するために変更を加えると、これも64ビットプラットフォーム固有のものになりますが、これは選択したくありません。System32


アプリを32ビットと64ビットの両方で問題なく実行できるソリューションはありますか?コードを変更する必要がありますか(どのように?)、またはこのコンソールアプリケーションプロジェクトのいくつかのプロパティ(どのプロパティ)を変更する必要がありますか?

4

4 に答える 4

32

ファイルシステムのリダイレクトに違反しました。

%windir%\System3264ビットアプリケーション専用に予約されているため、64ビットバージョンのWindowsでは、ディレクトリにアクセスしようとする32ビットアプリケーションは、32ビット%windir%\System32ディレクトリに自動的かつ透過的にリダイレクトされます%windir%\SysWOW64

まず、プログラムが実際に64ビットシステムフォルダに属していることを確認します。Windowsは、この自動リダイレクトを行うのには理由があります。32ビットのものは%windir%\System3264ビットバージョンのWindowsのフォルダには入りません。

何かを64ビットシステムディレクトリにコピーしたいことが確実な場合は、いくつかのオプションがあります。最も簡単なのは、ユーティリティを64ビットアプリケーションとしてコンパイルすることです。%windir%\Sysnativeまたは、の代わりにを使用して、リダイレクションを実行しないように、自分が何をしているかを知っていることをWOW64リダイレクタに伝えることができます%windir%\System32

于 2012-04-11T05:42:04.493 に答える
7

私も同じ問題を抱えていました。解決策は、Visual Studioのプロジェクトプロパティで、「プラットフォームターゲット」をx86ではなくx64またはAnyCPUとして設定することです。この場合、パスは"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));

ここに画像の説明を入力してください

于 2014-04-27T18:59:22.343 に答える
3

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);
    }
}
于 2016-06-24T19:11:40.283 に答える
2

パス環境変数にc:\windowsは両方のWindowsx86/ x64バージョンに含まれているので、ツールをc:\windows次のように配置してみません%windir%か?

私の場合、これで問題は解決します。

于 2013-02-07T09:42:30.473 に答える