У меня есть инструмент .Net, который генерирует электронную таблицу с использованием Open XML SDK. Это работало отлично в течение нескольких месяцев. Внезапно я получаю эту ошибку, периодически:
Could not load file or assembly 'DocumentFormat.OpenXml, Version=2.0.5022.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The specified module could not be found.
DocumentFormat.OpenXml, Version=2.0.5022.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
System.IO.FileNotFoundException: Could not load file or assembly 'DocumentFormat.OpenXml, Version=2.0.5022.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The specified module could not be found.
File name: 'DocumentFormat.OpenXml, Version=2.0.5022.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' ---> System.IO.FileNotFoundException: The specified module could not be found. (Exception from HRESULT: 0x8007007E)
at ConvertXMLtoExcel.ExcelGenerator.CreatePackage(String filePath)
at ConvertXMLtoExcel.Program.Main(String[] args)
System.IO.FileNotFoundException: The specified module could not be found. (Exception from HRESULT: 0x8007007E)
Я проверил, что файл DocumentFormat.OpenXml.dll находится в GAC. Когда я запускаю инструмент из командной строки вручную, он работает 100% времени. Он работает 100% времени на моей машине разработки (Windows 7).
Однако, когда команда вызывается веб-службой (Apache -> PHP -> exec), она дает сбой примерно в 50% случаев, за исключением приведенного выше.
Я слишком долго изучал эту проблему, чтобы ничего не придумать.
Наилучшие возможные объяснения, которые я прочитал, предполагают проблемы совместимости 32/64 бит или отсутствие DLL в GAC. Но это приведет к 100% провалу, верно? Даже если вы вошли как пользователь?
Я запустил sys internals ProcMon над процессом и запечатлел его как успешный, так и неудачный. У них профили совсем разные. Если я отфильтрую список по «Загрузить изображение», я увижу, что они начинаются точно так же, до точки.
Следующий загружает «C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ mscorwks.dll», отказавший - нет, и загружает «C: \ WINDOWS \ system32 \ faultrep.dll» вместо.
Спасибо за любые идеи!