アプリケーションの実行時に、psToolユーティリティをSystem32フォルダーにコピーする必要があります。
64ビットのWindows7を使用していて、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);
私がここで見逃している提案はありますか?
[〜#〜]編集[〜#〜]
以下の回答で指摘されているように、ファイルシステムのリダイレクトが行われています。 64ビットOS上のコンソールアプリケーション用に、VisualStudioのデフォルト設定でアプリを開発しています。アプリケーションが32ビットと64ビットの両方のOSで動作するように、コンパイル中にどの設定/スイッチを保持する必要があるかわかりません。
基本的には、OSのビットに関係なく、ファイルをSystem32
にコピーするように設定する必要があります。
プログラムの後半で、コマンドラインからpsToolsユーティリティにアクセスする必要がありますが、SysWOW64に配置すると使用できなくなります。 SysWOW64の32ビットcmd.exeを使用するために変更を加えると、これも64ビットプラットフォーム固有のものになりますが、これは選択したくありません。
アプリを32ビットと64ビットの両方で問題なく実行できるソリューションはありますか?コードを変更する必要がありますか(どのように?)、またはこのコンソールアプリケーションプロジェクトのいくつかのプロパティ(どのプロパティ)を変更する必要がありますか?
ファイルシステムリダイレクト のファウルを実行しました。
_%windir%\System32
_は64ビットアプリケーション専用に予約されているため、64ビットバージョンのWindowsでは、_%windir%\System32
_ディレクトリにアクセスしようとする32ビットアプリケーションは自動的かつ透過的に32ビット_%windir%\SysWOW64
_ディレクトリ。
まず、プログラムが実際に64ビットシステムフォルダーに属していることを確認します。 Windowsは、この自動リダイレクトを行うのには理由があります。 32ビットのものは64ビットバージョンのWindowsの_%windir%\System32
_フォルダーに入れられません。
ものを64ビットシステムディレクトリにコピーしたいことが確実な場合は、いくつかのオプションがあります。最も簡単なのは、ユーティリティを64ビットアプリケーションとしてコンパイルすることです。または、_%windir%\Sysnative
_の代わりに_%windir%\System32
_を使用して、リダイレクトを実行しないように、自分が何をしているかを知っていることをWOW64リダイレクタに伝えることができます。
私も同じ問題を抱えていました。解決策は、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));
パス環境変数には両方のWindowsx86/x64バージョンでc:\windows
が含まれているので、ツールをc:\windows
:%windir%
に入れてみませんか?
私の場合、これで問題は解決します。
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);
}
}