2009-07-10 6 views
0

J'utilise (et référence) deux dlls tiers (a.dll et b.dll) dans deux de mes applications C#. Je reçois un problème reproductible où les deux applications se bloquent lors d'un appel à une fonction dans la bibliothèque tierce.Impasse dans la 3ème partie dll

J'ai essayé de faire une copie de a.dll et b.dll (a2.dll, et b2.dll) et l'utiliser dans la deuxième application, mais il s'avère que a.dll références b.dll, anb b.dll fait référence à a.dll et cela ne se charge pas correctement.

Je suspecte qu'il y ait un interblocage mais dans la bibliothèque 3ème partie. Je ne peux pas utiliser le verrouillage pour empêcher cela. Chaque application impose le verrouillage pour s'assurer que cette application n'a qu'un seul thread accédant à la bibliothèque à la fois, mais je ne peux pas bloquer les deux programmes. Donc, ma question est de savoir comment puis-je résoudre ce problème? Puis-je dire au système d'exploitation (Windows XP) que je ne veux pas que la DLL soit partagée?

Merci, Joe

+0

S'agit-il d'applications distinctes? Dans ce cas, vous ne devriez pas avoir de problèmes avec un accès à un seul thread, car chaque processus le gérera correctement. Pouvez-vous clarifier pourquoi vous pensez qu'il y a une impasse. –

Répondre

4

Vous pouvez restreindre l'accès si un seul programme à la fois en utilisant un mutex nommé. Les mutex nommés sont restreints à un système d'exploitation entier, ils peuvent donc être utilisés pour empêcher l'accès de plusieurs processus. Pour plus de détails, voir le Mutex class.

+0

Est-ce que cela devrait être dans la 3ème partie dll quelque part, ou dans mon code? –

+0

Vous pouvez mettre cela dans votre code - cela fonctionne comme votre syncronisation de thread, sauf que vous pouvez "verrouiller" le système de ressources de cette façon. –

+0

Mutex est-il aussi rapide qu'un verrou (lockObject)? –

0

Qu'en est-il créer un autre thread - qui est responsable de l'accès à ce dll ... De cette façon, l'application entière ne gèle pas

+0

Je le fais déjà. Cependant, il me reste un fil critique dans chaque application gelé et les deux applications - bien que n'étant pas entièrement gelées - sont inutiles. –

1

1) Une façon

  • Créer une application serveur qui exporte/implémente l'API 3ème partie, et rend l'API disponible à d'autres/processus à distance (par exemple à l'aide de points Remoting net, ou web service, pour exposer l'API sur le réseau).
  • Dans l'application serveur, mettre en œuvre son API en déléguant aux DLLs tiers
  • Démarrer une seule instance de l'application serveur: il n'y a donc qu'une seule instance des DLL 3e partie utilisé
  • Demandez à vos applications existantes utilisez l'API exportée par votre service, au lieu d'utiliser les instances locales des DLL tierces
  • Dans votre service, implémentez des verrous (ce qui est possible car cela fait maintenant partie d'un processus unique).

2) Une autre façon: utiliser un type de verrou visible sur plus d'un processus (par exemple la classe Mutex).

3) Demandez aux fournisseurs des DLL tierces: êtes-vous censé pouvoir exécuter une seule instance de cette DLL à la fois? Si vous êtes autorisé à exécuter plusieurs instances, que devez-vous faire pour éviter les interblocages entre processus?

+0

1) Cela semble beaucoup de travail :-( 2) Peut-être ... 3) C'est semi-abandon open source. Ils n'ont pas eu de mise à jour depuis 2005. –

+0

1) Ça ne va pas très bien avec ce que vous avez dit plus tard, à propos de l'appeler 5000 fois par seconde. – ChrisW

1

J'ai déjà eu un problème similaire avec un produit tiers abandonné. Là, j'ai utilisé un désassembleur et un éditeur hexadécimal avec un assembleur intégré pour corriger le bug sous-jacent, mais c'était plus ou moins de chance car la cause était quelque chose de trivial qui pouvait être dérivé en regardant le désassemblage. Selon la cause réelle qui pourrait être une option pour vous.