2010-05-04 16 views
1

En cours de développement d'une DLL de connecteur au centre de qualité HP. J'utilise leur API COM (insert expelative) pour se connecter au serveur. Un wrapper Interop est créé automatiquement par VStudio.Le projet Visual Studio reste "bloqué" à l'arrêt

Ma solution a 2 projets: la DLL et une application testeur - essentiellement une forme avec des boutons qui appellent des fonctions dans la DLL. Tout fonctionne bien - je peux créer des défauts, les mettre à jour et les supprimer. Lorsque je ferme le formulaire principal, l'application s'arrête bien.

Mais quand j'appelle une fonction qui retourne une liste de tous les projets disponibles (pour remplir une liste déroulante), si je ferme le formulaire principal, VStudio montre toujours la solution comme étant en cours d'exécution et je dois l'arrêter.

J'ai réussi à identifier une seule fonction dans mon code que quand je l'appelle, la solution reste « accroché » et si je ne le fais pas, il ferme bien. Il est un appel à une propriété dans l'objet TDC get_VisibleProjects qui retourne une List (pas le .Net un, mais un type dans la bibliothèque COM) - Je viens itérer dessus et retourner une liste appropriée (que j'utiliser plus tard pour remplir le combo boîte):

public List<string> GetAvailableProjects() 
    { 
     List<string> projects = new List<string>(); 
     foreach (string project in this.tdc.get_VisibleProjects(qcDomain)) 
     { 
      projects.Add(project); 
     } 
     return projects; 
    } 

Mon hypothèse est que quelque chose est retenu en mémoire. Si je lance l'EXE en dehors de VStudio, il se ferme - mais qui sait ce qui reste en mémoire?

Ma question est: comment puis-je me débarrasser de l'appel de cette propriété? Le GC ne devrait-il pas gérer cela? Ai-je besoin de plonger dans les pointeurs?

choses que j'ai essayé:

  1. obtenir la liste dans une variable et le mettre à zéro à la fin de la fonction
  2. Ajout d'un destructor à la classe et l'objet tdc annulant
  3. En passant par l'application de la fonction de testeur à fond, lorsque le formulaire se ferme et que la fonction Main se termine, elle se ferme, mais VStudio indique toujours que je cours.

Merci pour votre aide!

+0

[Quand et comment utiliser Dispose et Finaliser en C#] (http: //www.devx.com/dotnet/article/33167/1954) –

+0

Merci pour le lien - Je suis au courant et essayé - ne fonctionne pas :( –

+0

Je n'ai pas de réponse, mais +1 pour une question joliment bien formulée –

Répondre

0

Essayez d'ajouter ces 2 lignes à l'événement post-construction:

call "$(DevEnvDir)..\Tools\vsvars32.bat" 
editbin.exe /NXCOMPAT:NO "$(TargetPath)" 
+0

Qu'est-ce que cela fait, si je peux demander? –

+0

S'il vous plaît lire ici: http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/06d76a1f-b7a5-489b-b937-755cd9bfa90a/ – GExGE

0

Avez-vous essayé libérer manuellement l'objet Liste à l'aide System.Runtime.InteropServices.Marshal.ReleaseComObject lorsque vous avez terminé avec elle?

+0

Bonne suggestion, va essayer de signaler –

+0

N'a pas fonctionné - projet toujours accroché :( –

0

Je suspecte certains fils qui pendent.

Lorsque cela se produit, mettre en pause le processus dans le débogueur et voir ce que les discussions sont toujours là.

+0

Essayé que - il ya quelques threads, mais pas le principal.Comment suggérez-vous que je continue? –

+0

Je ne suis pas un threading guy. D'après ce que je sais, il pourrait s'agir de deux choses: le mieux sera d'utiliser le débogueur pour fouiller et de voir qui a fait/possède les fils – leppie

0

Peut-être essayer de parcourir la liste manuellement en utilisant son compte et les propriétés de l'article au lieu de l'utiliser est iterator, quelque chose comme:

for (int i=1; i <= lst.Count ; ++i) 
{ 
string projectName = lst.Item(i); 
} 

Il pourrait être le itérateur qui le maintient en vie et non l'objet de liste elle-même , si vous n'utilisez pas un itérateur, cela pourrait ne pas poser de problème.

+0

Merci pour l'offre - c'était la première chose que j'ai essayée. –