Почему предпочитаемый 32-битный флаг вызывает проблемы с чтением системы чтения32

Я должен прочитать из файла, который хранится в Windows каталог, либо в System32 или же SysWOW64, Почему он там хранится и каким он заканчивается, не мне решать, но я проверяю реестр, чтобы получить строку, представляющую правильный путь. Это обычно C:\Windows\System32\FileName.Sys

Я давно написал обертку, чтобы справиться с чтением для меня, которая до недавнего времени работала нормально. Но когда я обновил проект для использования VS2013 и установил флаг "Предпочитать 32-битный", проверка файлов неожиданно начала возвращать false

if (!File.Exists(sysFilePath)) throw new FileNotFoundException(....

Когда я выключаю флаг, он снова начинает работать. Файл, который он ищет, определенно находится там, что заставляет меня думать, что есть какая-то проблема с разрешениями. Запуск этого с правами администратора не дал результатов, проверка файла все равно вернула false.

Кто-нибудь знает об изменениях разрешений на доступ System32 если приложение построено AnyCPU с проверенным Prefer 32-bit, а не без него? Или, может быть,.NET или Windows делают что-то под капотом, которое ищет в другом каталоге, чем я указываю?

1 ответ

Кажется, вы пытаетесь запустить скомпилированный двоичный файл на 64-битной машине. Если вы используете 32-битный флаг Prefer, CLR по возможности компилирует инструкции IL в x86 ( /questions/27016236/kakova-tsel-parametra-predpochitat-32-razryadnyij-v-visual-studio-2012-i-kak-on-na-samom-dele-rabotaet/27016238#27016238) вместо использования собственной архитектуры.

Когда программа работает в 32-битном режиме в 64-битной системе, некоторые системные пути виртуализируются. Например, "настоящая" система32 в файловой системе перенаправляется в папку SysWOW64. Поэтому, когда вы пытаетесь открыть файл, используя оригинальный путь к system32, вы просто не можете найти его там.

Вы должны рассмотреть возможность использования другой логики для определения местоположения открываемого файла. И, если возможно, выполните свой код в собственной подсистеме, чтобы пропустить шаг виртуализации.

Другие вопросы по тегам