2009-10-19 9 views
0

J'ai une situation où j'utilise une bibliothèque tierce. Sur les machines où la bibliothèque n'est pas installée, j'obtiens l'excption: Unable to load DLL '*.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E). Cependant, j'emballe le code appelant dans un bloc try-catch.erreur DLL introuvable

J'ai essayé d'intercepter Exception et DllNotFoundException et aucun d'entre eux n'attrape l'erreur. L'application se ferme ensuite de façon désagréable.

Je souhaite que l'application détecte l'erreur, puis continue sans utiliser la fonctionnalité tierce.

Comment puis-je soit empêcher l'erreur avec une vérification dll (sans connaître le chemin) ou attraper gracieusement l'erreur.

Editer: Plus de détails Ceci est une application tierce qui me permet d'utiliser un périphérique USB. Ils ont fourni un wrapper .net pour leur API non gérée (je pense). J'ai ajouté les dll gérés au projet de la manière normale.

Modifier: J'ai réussi à obtenir un chemin pour la DLL en question. Je fais un File.Exisits sur la DLL et ne pas entrer dans le bloc de code si la DLL n'existe pas. Cela semble fonctionner jusqu'à présent. Merci pour l'aide!

Répondre

4

L'exception est lancée dans le JITter, pas dans votre code (c'est-à-dire sur un thread différent). Cela signifie que vous êtes du beurre face à celui-ci.

2

Le JITter lançant l'exception rend cela un peu compliqué.

Vous pouvez vérifier la DLL, mais vous devez garder à l'esprit lorsque le JITter va chercher la DLL à charger.

Vous DEVEZ rechercher la DLL avant de charger les types qui dépendent de cette DLL. Le chargement des types se produit chaque fois que vous frappez une méthode qui appelle tous les types qui requièrent ce type. (sensationnel!). Donc, fondamentalement, vous devez vous assurer que vous n'appelez aucune méthode contenue dans les types qui appellent des méthodes nécessitant votre bibliothèque tierce. Ce que j'ai fait pour saftey est: envelopper toutes les références à la DLL dans un type qui n'est jamais accédé ou référencé directement - disons WrapperClass. Vérifiez l'existence de la DLL, puis (si elle existe), utilisez Activator.CreateInstance(...) pour créer une instance de WrapperClass.

Notez que cela fonctionne pour moi jusqu'à .net 3.5. Pour autant que je sache, il n'y a aucune garantie que cela ne sera pas brisé dans les futures versions, ou même par des correctifs.

2

Vous ne dites pas comment vous importez cette bibliothèque tierce? L'avez-vous ajouté à votre projet et laissez VS créer le wrapper pour vous automatiquement?

Vous utilisez DLLImport:

[DllImport("thirdParty.dll")] 
static extern int thirdPartyFunction(some params); 

De toute façon ces deux méthodes ne vont pas vous montrer beaucoup d'amour si le thirdParty.dll est pas installé sur la machine.

Vous devez faire ce qu'on appelle LateBinding vérifier cet article CodeProject sur la façon de faire Late binding on native DLLs with C#

Questions connexes