У меня очень странная проблема с разработанной мной службой 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);