Ошибка BadImageFormatException при запуске распакованного консольного приложения - PullRequest
1 голос
/ 24 октября 2019

У меня очень странная проблема с разработанной мной службой Windows и консольным приложением. Служба Windows написана на ядре c # .net. Для этого он берет zip-файл предварительно созданного консольного приложения ядра .net и распаковывает его в папку, затем вызывает Process.Start для его запуска.

Есть несколько потоков, которые обращаются к службе, и этоЗатем служба разархивирует файл, если он еще не разархивирован, и затем вызовет Process.Start для каждого потока запроса. Распаковка является поточно-ориентированной.

В некоторых случаях при запуске консольного приложения происходит сбой с ошибкой BadImageFormatException для случайной библиотеки DLL. Любые последующие вызовы запуска процесса завершатся с той же ошибкой на той же DLL.

Если я останавливаю службу и запускаю консольное приложение вручную, оно вылетает с той же ошибкой BadImageFormatException.

Теперь это становится странным. Если я скопирую папку, в которой находится консольное приложение, в другое место на том же диске на том же компьютере и запустлю ее - она ​​будет работать как обычно.

Если я скопирую dll, которая имела исключение BadImageFormatExmat, из исходной папки во временную папку, удалим исходную dll, затем скопирую резервную копию в исходную папку и снова запустим приложение - все работает как обычно.

Я изо всех сил пытался придумать причину этого. Что может вызвать BadImageFormatException для основного консольного приложения .net, если одно и то же приложение можно запустить на той же машине, просто скопировав его в другую папку?

Я видел это на нескольких компьютерах с Windows Server 2012 г. r2до 2016 года.

Обновление

Таким образом, после дополнительных испытаний кажется, что всякий раз, когда я запускаю консольное приложение BadImageFormatException, я могу заставить его работать снова, очистив файл Windows. кеш с помощью RAMMap от sysinternals.

Итак, вопрос в том, почему библиотеки dll либо модифицируются, либо портятся в файловом кеше? Я запускаю несколько процессов одновременно (может быть до 40 за раз), но это не должно приводить к изменению dll и выбрасыванию BadImageFormatException. Это что-то мешает загрузке .NetCore? Или это как разархивировать папку? Я использую библиотеки zip System.IO.Compression, например:

ZipFile.ExtractToDirectory(zipFile, outFolder);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...