2009-03-16 9 views
1

J'ai un objet COM hors processus que nous appelons à partir de C# en utilisant dllhost (nous n'avons pas pu utiliser COM +). Cela fonctionne très bien, et j'ai mon propre pool d'objets que je peux utiliser quand je le veux. L'objet COM sera réutilisé plusieurs fois et est en cours d'exécution (> 20 minutes parfois). Malheureusement, il s'agit d'une ancienne DLL ActiveX VB qui se bloque parfois. Donc, je dois être capable de le tuer. J'ai essayé de libérer l'objet COM explicitement et puis la collecte de place d'un autre thread, mais cela ne fait rien. Est-ce que quelqu'un a d'autres idées que d'attraper le PID de Dllhost et de le tuer quand je le lève (probablement pas aussi sûr)? Merci pour l'aide.Tuer un objet COM hors processus à partir de C#

J'ai essayé

System.Runtime.InteropServices.Marshal.ReleaseComObject(m_MyObj); 
GC.Collect(); 
GC.WaitForPendingFinalizers(); 
m_MyObj = null; 

et je crée par

uint hResult = Ole32Methods.CoCreateInstance(ref CalcServerGuid, null, (uint)CLSCTX.CLSCTX_LOCAL_SERVER, ref IID_IUnknown, 
      out CalcServerInstance); 
+0

Peut-être est-ce un signe qu'il est temps de porter cet ancien composant vers .NET? – Kev

+0

Je souhaite. Il faudra des années pour réécrire cela des dizaines d'ingénieurs. :( – Steve

Répondre

0

Si je comprends que vous utilisez un objet COM VB6 et vous dites au sein dllhost. Cela implique pour moi que c'est un composant configuré fonctionnant sous COM +. S'il s'agit d'une application serveur, vous pouvez utiliser le catalogue d'administration COM + pour arrêter l'application serveur.

FYI dllhost est le processus d'hébergement COM +.

Pourquoi utilisez-vous CoCreateInstance? Au lieu d'importer un wrapper et d'utiliser .net bcl pour créer l'objet. Mon seul autre avis est mieux de résoudre le problème du blocage puis d'essayer d'arrêter la piscine. Utilisez-vous réellement le regroupement d'objets dans votre VB via COM +? Il me semble rappeler que le pooling ne peut pas être fait avec un objet COM VB6 sans piratage en dehors des contraintes de VB6.

+0

Salut Josh, je n'utilise pas COM +, j'utilise dllhost directement (cela implique de changer quelques clés de registre et d'instancier comme ci-dessus.) Je crée le pool des objets hors proc en interne dans mon programme. Impossible d'utiliser COM + en raison des restrictions côté client – Steve

+0

heh ach ok sonne douloureux.Est-ce que vous utilisez un RCW? Pour envelopper l'objet com.Il y avait une méthode qui a publié toutes les références à un RCW.Je pense qu'il était sur Marshall. pensez Kev est le bon moment pour réécrire ;-) – JoshBerke

+0

@Steve Pouvez-vous contrôler sous quel utilisateur dllhost.exe est lancé? – sharptooth

Questions connexes