2009-08-30 2 views
1

J'utilise un tiers composant COM au moyen d'un ensemble de Interop .NET dans IronPython, comme on le voit ici: How can I use a VB6 COM 'reference' in IronPython?Comment puis-je disposer d'un objet COM VB6 que j'utilise via un assembly interop à partir de IronPython?

Mon expérience dans ce domaine a été super, je suis très impressionné par la quantité de choses Cela fonctionne parfaitement ... sauf une chose.

Le composant COM tiers utilise la bibliothèque DAO de Microsoft (je ne sais pas quelle version) pour fonctionner avec une base de données créée par une autre application tierce. Le problème est que ce fichier de base de données est recréé au cours de l'exécution de mon programme et que je souhaite 'désinitialiser' cet objet COM. En particulier, exécuter mon code (qui accède aux attributs du composant COM, appelle ses méthodes, etc.) fonctionne correctement la première fois que j'exécute ma routine. La prochaine fois, cependant, le composant COM tiers affiche une boîte de message indiquant que la base de données (fichier MSAccess 95 .mdb) est déjà utilisée et offre une option pour réessayer. En appuyant sur Réessayer fonctionne de manière fiable, donc le problème principal est que cette boîte de dialogue apparaît. Donc, ma théorie est que le composant COM fuit les poignées vers la base de données, et je ne trouve pas de méthode de nettoyage à appeler. J'ai essayé .Dispose(), mais cela n'a pas fonctionné. Mon dernier recours consiste à faire du code qui appelle l'objet COM un processus IronPython séparé qui interagit avec mon processus principal via std in/out car le rôle que l'objet COM sert est plus de «donner toutes ces informations maintenant 'use case au lieu d'une dépendance continuellement requise.

J'espère éviter ce scénario, et puisque je ne suis pas familier avec COM (ou vraiment, .NET d'ailleurs) je ne peux qu'espérer que je manque une méthode évidente .Dispose ou similaire.

S'il n'y a pas de méthode propre, puis-je décharger de force l'ensemble de mon processus, de manière analogue aux appels FreeLibrary répétés en code natif? (Je vous garantis que mon code n'utilisera plus l'objet, donc je ne devrait pas avoir à vous soucier de manquer refs de ma part conduit à une erreur de protection de la mémoire)


EDIT:

I n'a pas pu résoudre ce problème, alors je suis allé à la méthode hors processus et laisser les fenêtres nettoyer lorsque mon processus de lot d'enfant s'arrête.

Répondre

1

Vous ne savez pas à propos de IronPython, mais lorsque vous travaillez avec COM en C#, vous devez appeler Marshal.ReleaseComObject après utilisation pour vous assurer que le nombre de références est correctement décrémenté.

Sinon, vous fuire ... Dispose() ne le fait pas pour vous.

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.releasecomobject.aspx

+0

J'ai lu sur ReleaseComObject et je sais maintenant plus. Malheureusement, mon composant COM tiers ne se comporte pas correctement. J'ai vérifié mon code pour toutes les références, et ils sont tous nettoyés. En particulier, j'utilise maintenant la classe ComWrap ici http://dump.cbwhiz.com/comwrap.py pour publier des références. –

Questions connexes