Да, виртуализация происходит на очень низком уровне. Метод 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 );
}
}
Обновление: Вам также может потребоваться проверить версию ОС перед отключением перенаправления WOW, поскольку более ранние версии XP (я полагаю, до SP2) не предоставляют эти методы.
Обновление 2: Добавлена проверка ОС для 64-битных. Все 64-разрядные версии ОС реализуют эти методы, и вам нужно только отключить состояние, если он работает на 64-разрядной ОС.