Проверка внешних зависимостей в vb.net

То, что я никогда раньше не делал, но как лучше всего убедиться, что доступны любые внешние сборки / библиотеки, которые использует мое приложение, и, возможно, правильная версия.

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
237
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы должны перехватить ошибку вне основного цикла. Или, если вы хотите отправить / найти свои собственные сборки, вы можете попробовать переопределить проверку сборки: Связь.

Ответ принят как подходящий

Что вы хотите сделать, так это использовать отражение, чтобы проверить, можно ли загрузить сборку в память. Оберните это в блоке 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

Вы можете использовать проект установки для создания установщика для своего приложения. Это проанализирует все статические зависимости и создаст установщик, который гарантирует, что целевая машина получит все, что ей нужно.

(Я установил на нем флаг, принадлежащий сообществу, потому что это в основном все из-за моего инстинкта, и я, вероятно, где-то пропустил важный шаг)

Короткий ответ: Обычно рекомендуется развертывать зависимости вместе с приложением с помощью установщика. Без них, как вы заметили, очень мало шансов на то, что ваше приложение будет работать.

Длинный ответ: Хорошо, допустим, у вас есть функциональность дополнительный, которую вы хотите предоставить, если на целевой машине установлено что-то еще. Вот несколько общих рекомендаций:

  1. Для любого типа, который имеет поле, свойство, событие, параметр или возвращаемое значение, которое ссылается на тип, определенный в возможно удаленной сборке: должен быть заключен в оболочку с интерфейсом и заменять все остальные поля, параметры, возвращаемое значение или локальные объявления переменных для использования интерфейса.
  2. Каждый раз, когда вы переходите к созданию одного из ранее обернутых классов, вы должны использовать метод System.Activator.CreateInstance и заключить его в фильтрацию try / catch по 7 различным типам исключений:

    • FileNotFoundException
    • FileLoadException
    • BadImageFormatException
    • TypeLoadException
    • MissingMethodException
    • MissingMemberException
    • MissingFieldException

    Если один из них обнаружен, вы должны либо предоставить альтернативную реализацию ранее созданного интерфейса, либо написать свой код, чтобы он проверял значение null каждый раз, когда он ссылается на этот объект.

Спасибо за это объяснение, я буду использовать пример кода, предоставленный Джошем, но эта информация также очень полезна.

beakersoft 20.09.2008 19:27

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