2010-09-09 5 views
1

J'interagis avec un composant COM personnalisé appelé CSCCOM dans mon projet C#.La DLL COM n'est pas vidée

Je l'emballage avec IDisposable comme ci-dessous:

Form1.cs

try { 
    using (CSCCOMWRAP CSC = new CSCCOMWRAP()) { 
     CSCCodeList CSCL = new CSCCodeList(CSC); 

     comboBox1.DataSource = CSCL.List; 

     Marshal.ReleaseComObject(CSCL); 
    } 
} 
catch (COMException ex) { } 

CSCCodeList.cs

try { 
    var cscl = CSC.GetCodes(); 

    for (int i = 1; i <= cscl.Count(); i++) { 
     object item = i; 
     var code = cscl.Item(ref item); 

     List.Add(new CSCCode((string)code.Name, Convert.ToString(code.Code))); 
    } 
} 
catch (Exception ex) {); 

Une fois le programme exécuté, je vois encore CSCCOM.dll deux fois dans la vue DLL du volet inférieur ProcessExplorer's.

Cela suggère que, pour une raison quelconque, ma DLL COM ne soit pas évacuée du système.

+0

Y a-t-il une raison particulière pour laquelle vous avez supprimé cette question? Normalement, seules les questions inutiles sont supprimées, et cette question n'est clairement pas inutile. –

+0

Merci @mmyers. S'il vous plaît, quel est votre prénom? –

+0

@mmyers: Je suis d'accord. Mais je pensais que j'étais en train d'exposer mon code. Mais je pense que j'aurais dû l'éditer plutôt que de le supprimer. Appréciez votre critique sur cette action du mien :) Je m'excuse vraiment à MrDosu pour ceci. – Moon

Répondre

3

Long time no COM, mais il me semble que vous n'êtes jamais délier la CsCl ou un code VARs

   var cscl = CSC.GetCodes(); 

       for (int i = 1; i <= cscl.Count(); i++) { 
        object item = i; 
        var code = cscl.Item(ref item); 

        List.Add(new CSCCode((string)code.Name, Convert.ToString(code.Code))); 

avec ReleaseComObject, ce qui RCW comptages ne sont pas décrémenté et faire le dll "flotter"

+0

Comment ai-je raté ça? Merci beaucoup de l'avoir signalé :) Vraiment l'apprécier :) – Moon

+0

parce que COM est une magie noire sadique créée pour torturer le genre progging; p – MrDosu

0

Voici ce qui doit être modifié dans CSCCodeList.cs:

try { 
    var cscl = CSC.GetCodes(); 

    for (int i = 1; i <= cscl.Count(); i++) { 
     object item = i; 
     var code = cscl.Item(ref item); 

     List.Add(new CSCCode((string)code.Name, Convert.ToString(code.Code))); 

     Marshal.ReleaseComObject(code); 
    } 

    Marshal.ReleaseComObject(cscl); 
} 

Espérons que ça aide quelqu'un!