Почему предпочитаемый 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, вы просто не можете найти его там.
Вы должны рассмотреть возможность использования другой логики для определения местоположения открываемого файла. И, если возможно, выполните свой код в собственной подсистеме, чтобы пропустить шаг виртуализации.