2008-09-20 7 views
1

Quelque chose que je n'ai jamais vraiment fait auparavant, mais quel est le meilleur moyen de s'assurer que tous les assemblys/dll externes que mon application utilise sont disponibles, et éventuellement la bonne version.Vérification des dépendances externes dans vb.net

J'ai écrit une application qui repose sur le System.Data.SQLite.dll, je suis allé le tester sur une machine où cette DLL était manquante, et mon application a jeté une exception d'exécution car la DLL était manquante. Comment puis-je piéger cette erreur?

Répondre

1

Ce que vous voulez faire est d'utiliser la réflexion pour vérifier et voir si l'assemblage peut être chargé en mémoire. Emballez-le dans un bloc try..catch et gérez toutes les exceptions spécifiques qui en découlent.

Try 
    Assembly.Load("System.Data.SQLite, Version=1.0.22.0, Culture=neutral, PublicKeyToken=DB937BC2D44FF139"); 
Catch ex As FileNotFoundException 
    //do something here 
End Try 
0

Vous devez intercepter l'erreur en dehors de votre boucle principale.
Ou si vous souhaitez expédier/localiser vos propres assemblys, vous pouvez essayer de remplacer le sondage d'assemblage: Link.

0

Vous pouvez utiliser un projet d'installation pour créer un programme d'installation pour votre application. Cela analyserait toutes les dépendances statiques et produirait un installateur qui s'assurera que la machine cible obtient tout ce dont elle a besoin.

1

(je l'ai mis le drapeau appartient à la communauté sur celui-ci, parce que c'est la plupart du temps tout de mon instinct, et je l'ai probablement manqué une étape cruciale là quelque part)

Réponse courte : C'est généralement une bonne idée de déployer vos dépendances à côté de votre application, en utilisant un programme d'installation. Sans eux, comme vous l'avez remarqué, il y a très peu de chance que votre application fonctionne.

Réponse longue: Ok, que vous avez fonctionnalité supplémentaire que vous voulez fournir si quelque chose d'autre est installé sur la machine cible. Voici quelques directives générales pour le faire:

  1. Pour tout type qui a un champ, une propriété, un événement, un paramètre ou valeur de retour qui fait référence à un type défini dans l'assemblage éventuellement désinstallés: doit être enveloppé d'une interface, et remplacez toutes les autres déclarations de champ, de paramètre, de valeur de retour ou de variable locale pour utiliser l'interface.
  2. Chaque fois que vous allez construire une des classes enveloppées précédemment, vous devez utiliser la méthode System.Activator.CreateInstance, et l'envelopper dans un try/catch filtrage sur 7 différents types d'exception:

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

    Si l'un de ceux qui est pris, vous devez soit fournir une implémentation alternative de l'interface créée précédemment, ou écrivez votre code afin qu'il vérifie nul tout temps, il fait référence à cet objet.

+0

Merci pour cette explication, mal utiliser le code d'exemple fourni par Josh, mais cette information est très utile aussi bien – beakersoft

Questions connexes