У меня есть 32-битное .Net приложение winform, которое вызывает C ++ dll. Мы упаковываем приложение в установщик, и оно отлично работает и работает как минимум на 20 компьютерах. Приложение было изначально разработано и отлично работает на компьютере с Win 7 x64 (мой).
Однако, когда я запускаю его на моем рабочем столе боссов (Win 7 x64), приложение не запускается.
о да…
Когда я пытаюсь запустить приложение, я получаю диалог JIT с
System.IO.FileNotFoundException: указанный модуль не найден. (Исключение из HRESULT: 0x8007007E)
Когда я запускаю, зависит от exe-файла на машине боссов, он говорит, что exe приложения x86, но что все зависимые dll в x64 и помечает его как ошибку. Когда я запускаю, это зависит от приложения на моей машине, exe и dll помечаются как x86.
Как это может измениться между машинами? Установщик просто распаковывает и копирует обычным способом и отлично работает на множестве других компьютеров x64 …
естественно, он ломается только на его машине, которая находится в двух часах езды, и у нас будет выставка. вздох.
очень смущенный…
================= решено ==================
Итак, мы исправили это. Найти пропавшую без вести dll было немного сложно.
Прежде всего, мы обманываем и бежали не ту версию зависит для коробки x64. Так что неправильно сообщалось, что приложение ищет x64 dll. Если бы мы запустили правильную версию, я думаю, мы бы поймали проблему раньше.
Что решило это для нас, так это просмотр журнала Монитор процесса из внутренних систем. Он регистрирует каждый доступ к файлу и чтение реестра. Журнал быстро показал сбой чтения на Direct X 11 DLL.
Оказывается, предыдущий установщик из какого-то другого приложения был установлен немного DX11 DLL. Это обмануло наш установщик и пропустило шаг DirectX 11, поэтому у нас пропал dll.
Спасибо за помощь, ребята!
Это простая ошибка типа «файл не найден», но с очень неловким поведением, которое не говорит вам какие DLL не может быть найдена. Это может быть C ++ DLL, но также и любые неявные зависимости DLL, которые могут быть. Как и библиотеки DLL поддержки времени выполнения, которые обычно отсутствуют, вы можете развернуть их с помощью установщика vcredist. Или развертывание отладочной сборки DLL, которая не может работать.
Чтобы получить достойную диагностику, нужно включить оснастку загрузчика и отладчик. Это неизменно сложно сделать на машине, на которой не установлены инструменты. Утилита SysInternals ProcMon — отличная альтернатива, вы увидите программу, ищущую DLL. Хотя вы утонете в количестве данных трассировки, которые оно генерирует. Работа от нижней части следа назад.
Других решений пока нет …