2010-10-21 23 views
0

Puis-je savoir comment libérer de force l'objet serveur COM de C# .NET si une condition particulière échoue ou si l'objet est partiellement construit?Comment libérer de force l'objet serveur COM à partir de C# .NET

Le problème est que j'utilise ce serveur COM en utilisant le mécanisme DCOM; dans le pire des cas, lorsque l'objet n'est pas entièrement créé et que je sors de l'application depuis l'échec, l'objet COM est toujours en mémoire (affiché dans les services de composants d'application COM +). Si cela va au-delà de certaines limites, cela entraîne une fuite de mémoire et un crash. Mais si son nombre gérable d'échecs, il est supprimé après un certain nombre de fois. Exemple: Calculator.App objApp = new Calculator.App();

si {// comment liberer l'objet COM objApp }

Note (obj.CanBeUsed()!): Il est par Garbase Collector GC.Collect() méthode utilisée pour de- allouer de la mémoire de tas avec force. Est-ce que je peux employer cette méthode ou .NET franework donne n'importe quelle autre solution pour ce cas particulier?

+0

Merci pour votre commentaire à ce sujet, Aamir. Je vais y travailler à l'avenir. Je n'étais pas au courant de cela, merci encore. –

Répondre

2

Comme ceci:

System.Runtime.InteropServices.Marshal.ReleaseComObject(objApp); 
+0

Il existe un blog MSDN indiquant que l'utilisation de ReleaseComObject() est très dangereuse. http://blogs.msdn.com/b/visualstudio/archive/2010/03/01/marshal-releasecomobject-considered-dangerous.aspx. Vous avez des points à ce sujet? –

+1

Vous avez parlé de libérer l'objet avec force, non? Chaque fois que vous ferez quelque chose de force, il y aura des effets secondaires :) – Aamir

+0

Ici, l'effet secondaire ne devrait pas arriver :(. Je vais utiliser pour éviter les fuites de mémoire seulement, pour aider le framework .NET :). –

1

Vous devriez essayer la méthode Marshal.FinalReleaseComObject.

La méthode FinalReleaseComObject libère la référence à un objet géré COM. L'appel de cette méthode est équivalent à l'appel de la méthode ReleaseComObject dans une boucle jusqu'à ce qu'elle renvoie 0 (zéro).

Lorsque le compte de référence sur l'objet COM devient 0, l'objet COM est habituellement libéré, bien que cela dépende sur la mise en œuvre de l'objet COM et est hors du contrôle de l'exécution. Cependant, le RCW peut toujours exister, en attente d'être récupéré.

L'objet COM ne peut pas être utilisé après que a été séparé de son sous-jacente RCW. Si vous essayez d'appeler une méthode sur le RCW après que son nombre de référence devient 0, une InvalidComObjectException sera levée.

+0

C'est un peu dangereux. De MSDN: «libère toutes les références à un wrapper Caller Wrapper (RCW) en définissant son compteur de référence à 0.» Cela signifie qu'il va essayer de mettre le nombre de références à 0, ce qui peut être mauvais, car il pourrait aussi y avoir d'autres références valides. – Aamir

+0

@Amir: Je pensais que la désallocation forcée est le point. –

+0

Il existe un blog MSDN indiquant que l'utilisation de ReleaseComObject() est très dangereuse. http://blogs.msdn.com/b/visualstudio/archive/2010/03/01/marshal-releasecomobject-considered-dangerous.aspx. –