Windows 7 .NET 3.5.1 - 2.0 слегка поврежден, как восстановить?

Моя установка Windows 7, включающая.NET (от 3.5 до 2.0), выглядит очень незначительно и особенно повреждена, и я пытаюсь исправить это, не переустанавливая Windows или не пытаясь вернуться к резервным копиям.

Все работало, и затем мой жесткий диск начал повреждать несколько файлов, и checkdisk обнаружил плохие кластеры, поэтому я представил диск на новый. Как только я загрузился на новом диске, все работало, кроме программ, которые вызывают методы System.Net.NetworkInformation в.NET 3.5 до 2.0 (например, Ping() и IsNetworkAvailable()), которые сразу же приводят к аварийному завершению приложения, в котором выполняются вызовы (эти звонки в.NET 4.0 работают нормально). Эти методы находятся внутри System.dll, и я предполагаю, что вызовите нативные методы, которые, по моему мнению, находятся внутри winnsi.dll или iphlpapi.dll или что-то еще (я пока не нашел этого); Я предполагаю, что он вызывает нативные методы, потому что исключение, вызывающее сбой, - это ошибка Fatal Execution Engine Error, о которой упоминают люди, которая обычно связана с вызовом нативных методов и распределением данных между ними.

Огромная подсказка о виновнике, вероятно, заключается в том, что когда я запускаю точно такое же приложение, вызывающее сбой, через профилировщик кода (который выполняет exe-файл и регистрирует статистику, какие методы заняли больше всего времени), приложение работает нормально, без сбоев! Как может работать его в профилировщике, а работать вне его? Это кажется ключом к тайне.

  • Я использовал procmon для перехвата всех событий реестра, файловой системы и сети из аварийного выполнения и успешного выполнения профилировщика и сравнил два вывода, но многому не научился (я вижу момент, когда непрофилированное приложение вылетает, но до тех пор они ведут себя одинаково, загружают одинаковые модули,). Единственная большая разница заключается в том, что в момент, предшествующий краху приложения, исполняемый профилировщиком код создает 4-6 новых потоков, а непосредственно исполняемый код создает только 1-2.
  • Я обнаружил файлы / каталоги, которые казались наиболее релевантными (материал.NET в Windows и Program Files) до и после проблем с диском, и не увидел никаких изменений там, где я не ожидал каких-либо изменений (нет явного повреждения файла).
  • Я изучил проблемы с программным обеспечением и системным реестром до и после проблем с диском и не увидел изменений, которые казались актуальными.
  • Я создал новую учетную запись пользователя и очистил все переменные среды на случай, если среда была связана. Без изменений.
  • Я сделал "SFC / SCANNOW", и он не нашел проблем с целостностью.
  • Я попытался "ngen update" для восстановления предварительно скомпилированного кода на случай, если я пропустил что-то, что может быть повреждено, и ничего не изменилось.

Я предполагаю, что мне нужно восстановить мою установку.NET, но, поскольку Windows 7 включает.NET 3.5 - 2.0, вы не можете просто перезапустить установщик.NET, чтобы повторить его. У меня нет доступа к дискам Windows, чтобы попытаться переустановить Windows поверх себя (на компьютере есть раздел для восстановления, но он непригоден для использования); Кроме того, накопитель использует решение для шифрования всего диска, и переустановка будет затруднена.

Я абсолютно не хочу начинать с нуля и устанавливать новую Windows, переустанавливать десятки пакетов программного обеспечения, пробовать и помнить десятки настроек, связанных с разработкой / и т.д.

Учитывая все это... у кого-нибудь есть полезные советы? Мне нужно, чтобы.NET 3.5 - 2.0 работал как разработчик, и мне нужно собрать и протестировать его.

Спасибо!

Quinxy

1 ответ

Краткий ответ: файл System.ni.dll поврежден, я его заменил и все хорошо.

Я вспомнил, что должен перепроверить журнал chkdsk, который я продолжал перечислять файлы, которые были повреждены в результате сбоя диска. После сбоя я превратил все перечисленные идентификаторы файлов в пути / имена файлов и заменил все 100+ файлов, которые я мог, из резервной копии, но, конечно же, когда я вернулся и посмотрел, я обнаружил, что, хотя я заменил 4 или 5 Файлы, связанные с.NET, был один такой файл, который я не смог заменить, потому что в то время он "использовался". Этот файл? System.ni.dll!!! Теперь я смог заменить этот файл из резервной копии и вуаля, моя установка.NET вернулась к нормальной работе, приложения работают независимо от того, профилированы они или нет.

Огорчает то, что, когда этот инцидент впервые произошел, я полностью ожидал, что проблема будет связана с поврежденным файлом, а именно с файлом System.dll, в котором хранятся методы, которые потерпели неудачу. И поэтому я обнаружил и переадресовал все файлы с именем System.dll. Но в то время я не осознавал, что System.ni.dll был встроенным проявлением System.dll (или чего-то такого). И поскольку я обнаружил и переадресовал связанные с.NET каталоги и не заметил этого (не знаю, как я это пропустил), я отказался от этого подхода.

Во всяком случае... Короче говоря, это был поврежденный System.ni.dll, который вызвал мои проблемы, один или несколько кластеров в нем заменили свое содержимое на 0x0, и это просто так проявилось как странная проблема, которую я наблюдал.

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