Моя 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 и фиксирует статистику по тем методам, которые занимали больше всего времени), приложение работает нормально, без сбоев! Как он мог работать в профилировщике, а запуск снаружи - не работать? Кажется, это ключ к разгадке тайны.
Я предполагаю, что мне нужно восстановить мою установку .NET, но поскольку Windows 7 включала .NET 3.5–2.0, вы не можете просто повторно запустить установщик .NET, чтобы повторить его. У меня нет доступа к дискам Windows, чтобы попытаться переустановить Windows поверх себя (на компьютере есть раздел восстановления, но он непригоден для использования); Кроме того, в приводе используется решение для шифрования всего диска, и повторная установка будет затруднена.
Я абсолютно не хочу начинать здесь с нуля и устанавливать свежую Windows, переустанавливать десятки программных пакетов, пытаться запомнить десятки настроек, связанных с разработкой и т. Д.
Учитывая все это ... есть ли у кого-нибудь полезный совет? Мне нужен .NET 3.5–2.0, поскольку я разработчик, и мне нужно построить и протестировать его.
Спасибо!
Quinxy
Короткий ответ: мой файл 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, и это проявилось как странная проблема, которую я заметил.