Как отладить ошибки времени выполнения "Не удалось загрузить файл или сборку"?

У меня есть проект, который использует библиотеку Java, преобразованную с использованием IKVM. Я добавил созданную библиотеку DLL и все возможные библиотеки IKVM в качестве ссылок на мой проект, но при запуске я получаю следующую ошибку времени выполнения:

System.IO.FileNotFoundException: не удалось загрузить ядро ​​файла или сборки, версия =0.0.0.0, культура = нейтральная, PublicKeyToken=null'или одна из ее зависимостей. Система не может найти указанный файл.

Я не совсем уверен, как отладить эту ошибку. Есть ли способ точно узнать, какой тип отсутствует? Из описания я бы предположил, что это сгенерированная DLL (из библиотеки Java), но я правильно добавил ее в качестве ссылки.

Что еще я сделал не так?

6 ответов

Решение

Вы можете использовать Fusion Log Viewer для устранения проблем загрузки сборок в приложениях.NET.

Кроме того, Process Monitor очень полезен для выявления общих проблем с загрузкой файлов.

Простое переключение между этим средством просмотра зависимостей и средством просмотра журнала fusion не очень хорошо работает для приложений, которые имеют собственный и управляемый код вместе или выполняют динамическую загрузку собственного кода. Вот хороший пост, объясняющий пошаговое руководство по устранению отсутствующих (или недопустимых разрешений) ошибок сборки с помощью монитора процессов, который охватывает эти сценарии:

Отладка Не удалось загрузить файл или сборку или ошибку одной из зависимостей с Process Monitor

Пост также включает в себя инструмент для автоматизации некоторых из этой задачи, а также

Вы можете диагностировать это с помощью Fusion Log Viewer (доступно в Microsoft SDK). Запустите его в Администраторе и активируйте журнал в Настройках.

Он будет регистрировать всю информацию, касающуюся загрузки ваших ссылок (и всех их ссылок). Он явно скажет вам, какая ссылка отсутствует и где он ее искал.

MSDN на Fusion Log Viewer

Существует программа под названием Dependency Walker, которая позволяет вам видеть зависимости данного PE-файла (dll, exe, ocx...).

Эта ошибка действительно раздражает, ее очень трудно отладить. Вы должны убедиться, что ваша dll присутствует так же, как и ЛЮБАЯ зависимость, которая есть у dll. Этот ключевой момент, как правило, начинается с головной боли.

Используя ProcessMonitor (из Sysinternals Suite), вы могли видеть, какую DLL ищет ваш процесс прямо перед тем, как генерируется исключение.

Средство обхода зависимостей статически разрешает все библиотеки DLL, необходимые для собственного PE-файла, и отмечает отсутствующие зависимости, тогда как Fusion Log Viewer обнаруживает проблемы привязки сборки в управляемом коде во время выполнения. Для управляемого кода.Net, который динамически загружает собственные библиотеки DLL, этих инструментов недостаточно.

Вот сообщение в блоге о том, как можно использовать Process Monitor для отладки проблем "Не удалось загрузить файл или сборку": https://www.codeproject.com/Articles/560816/Troubleshooting-dependency-resolution-problems-usi неполадок- dependency-resolution- problems- usi

Другие вопросы по тегам