То, что я никогда раньше не делал, но как лучше всего убедиться, что доступны любые внешние сборки / библиотеки, которые использует мое приложение, и, возможно, правильная версия.
Я написал приложение, которое полагается на System.Data.SQLite.dll, я пошел протестировать его на машине, где эта dll отсутствовала, и мое приложение просто выдало исключение времени выполнения, потому что dll отсутствовала. Как я могу отловить эту ошибку?





Вы должны перехватить ошибку вне основного цикла. Или, если вы хотите отправить / найти свои собственные сборки, вы можете попробовать переопределить проверку сборки: Связь.
Что вы хотите сделать, так это использовать отражение, чтобы проверить, можно ли загрузить сборку в память. Оберните это в блоке try..catch и обработайте любые конкретные исключения, которые происходят из него.
Try
Assembly.Load("System.Data.SQLite, Version=1.0.22.0, Culture=neutral, PublicKeyToken=DB937BC2D44FF139");
Catch ex As FileNotFoundException
//do something here
End Try
Вы можете использовать проект установки для создания установщика для своего приложения. Это проанализирует все статические зависимости и создаст установщик, который гарантирует, что целевая машина получит все, что ей нужно.
(Я установил на нем флаг, принадлежащий сообществу, потому что это в основном все из-за моего инстинкта, и я, вероятно, где-то пропустил важный шаг)
Короткий ответ: Обычно рекомендуется развертывать зависимости вместе с приложением с помощью установщика. Без них, как вы заметили, очень мало шансов на то, что ваше приложение будет работать.
Длинный ответ: Хорошо, допустим, у вас есть функциональность дополнительный, которую вы хотите предоставить, если на целевой машине установлено что-то еще. Вот несколько общих рекомендаций:
Каждый раз, когда вы переходите к созданию одного из ранее обернутых классов, вы должны использовать метод System.Activator.CreateInstance и заключить его в фильтрацию try / catch по 7 различным типам исключений:
FileNotFoundExceptionFileLoadExceptionBadImageFormatExceptionTypeLoadExceptionMissingMethodExceptionMissingMemberExceptionMissingFieldExceptionЕсли один из них обнаружен, вы должны либо предоставить альтернативную реализацию ранее созданного интерфейса, либо написать свой код, чтобы он проверял значение null каждый раз, когда он ссылается на этот объект.
Спасибо за это объяснение, я буду использовать пример кода, предоставленный Джошем, но эта информация также очень полезна.