はい、仮想化は非常に低いレベルで行われます。 File.Existsメソッドは、基本的にWin32 CreateFileメソッドを呼び出し、エラーをチェックします。 CreateFileは、WOWサブシステムによってリダイレクトされます。
仮想化を一時的に無効にしてから、電話をかけることができます。
[DllImport("kernel32", CharSet=CharSet.Unicode, SetLastError=true)]
public static extern bool Wow64DisableWow64FsRedirection(ref IntPtr oldValue);
[DllImport("kernel32", CharSet=CharSet.Unicode, SetLastError=true)]
public static extern bool Wow64RevertWow64FsRedirection(IntPtr oldValue);
もちろん、仮想化を使用してファイルの有無を確認する必要があります。同じことがレジストリエントリのチェックにも適用されます。
public static bool FileExists(string path)
{
if(File.Exists(path)) return true;
IntPtr oldValue = IntPtr.Zero;
try
{
if(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432") == null)
return false;
Wow64DisableWow64FsRedirection(ref oldValue);
if(File.Exists(path)) return true;
return false;
}
finally
{
if(oldValue != IntPtr.Zero)
Wow64RevertWow64FsRedirection(ref oldValue);
}
}
更新: XP(私は信じて前SP2)以前のバージョンは、これらのメソッドを公開していないので、あなたはまた、WOWリダイレクトを無効にする前に、OSのバージョンを確認する必要があるかもしれません。
更新2: 64ビットのOSチェックが追加されました。 OSのすべての64ビットバージョンがこれらの方法を実装しているため、64ビットOS上で実行している場合にのみ、その状態を無効にする必要があります。
私にとってうまく動作します。あなたの環境は何ですか? – Noldorin