2010-09-14 10 views
0

J'ai une classe C# qui utilise un composant COM en utilisant interop. Voici l'exemple de code:Obtention d'une exception COM lors de l'utilisation d'Interop dans une application .net

public class MyClass 
{ 

MyCOMClass myObj=null; 
try 
{ 
myObj = new MyCOMClass(); 

for (int num = 0; num < myArr.Length; num++) 
{  
    //Call a method on myObj and do some processing 
} 
} 
catch(Exception ex) 
{ 
//log exception 
} 
finally 
{ 
if (myObj != null) 
      { 
       System.Runtime.InteropServices.Marshal.ReleaseComObject(myObj); 
      } 

} 
} 

Ici, la boucle dure environ 150 fois. N L'exécution de ce code, dans le bloc catch, obtient une exception: "L'objet COM qui a été séparé de son RCW sous-jacent ne peut pas être utilisé."

J'ai essayé implémentant l'interface IDisposable puis écrire méthode Dispose:

public class MyClass: IDisposable 
{ 
public void Dispose() 
     { 
      Dispose(true); 
      GC.SuppressFinalize(true); 
     } 


     protected virtual void Dispose(bool diposeMgdResources) 
     {    
      if (!this.disposed) 
      { 
       if (diposeMgdResources) 
       { 
        if (myObj != null) 
        { 
         System.Runtime.InteropServices.Marshal.ReleaseComObject(myObj); 
        } 
       } 
       this.disposed = true; 
      } 
     } 
} 

À partir du client, je l'appelle alors disposer sur cette classe comme: myClass.Dispose();

Mais, je reçois toujours la même exception ici. Qu'est-ce qui me manque?

Merci d'avoir lu.

+0

Pourriez-vous coller '// Appeler une méthode sur myObj et faire du code de traitement? Ma première supposition est que l'objet est nettoyé quelque part là-bas. – Grzenio

Répondre