Sí, la virtualización ocurre en un nivel muy bajo. El método File.Exists básicamente llama al método Win32 CreateFile y comprueba si hay errores. CreateFile es redirigido por el subsistema WOW.
Puede desactivar la virtualización temporalmente antes de llamar.
[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);
Por supuesto, para estar completo, deberá verificar la existencia del archivo con la virtualización activada y desactivada. Lo mismo se aplica para verificar entradas de registro también.
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);
}
}
Actualización: También puede ser necesario para comprobar la versión del sistema operativo antes de deshabilitar la redirección WOW porque las versiones anteriores de XP (SP2 Pre creo) no exponen esos métodos.
Actualización 2: Comprobación de sistema operativo añadida para 64 bits. Todas las versiones de 64 bits del sistema operativo implementan estos métodos y solo necesita desactivar el estado si se ejecuta en un sistema operativo de 64 bits.
Funciona bien para mí. ¿Cuál es tu entorno? – Noldorin