Des idées Pourquoi le code suivant ne quitte pas le processus Outlook 2007 créé via Com Interop? Un extrait presque identique à l'aide de Word Works, donc je me demande si j'oublie si j'oublie de nettoyer quelque chose ... p> p>
4 Réponses :
essayer suivant après l'application.quit ();
Ensuite, demeurer là-bas ... merci quand même.
Mauvais chemin autour. Collecter () doit être d'abord.
@nobugz: même résultat. Processus toujours là après avoir quitté ().
Essayez cela à la place, cela fonctionne pour moi, il y aura quelques secondes retards avant de partir:
app.Quit(); // System.Runtime.InteropServices.Marshal.ReleaseComObject(app); GC.Collect(); GC.WaitForPendingFinalizers();
Vous avez un 3ème objet COM référencé dans votre code: app.session code>. Cela doit également être libéré correctement. Essayez ce code:
Microsoft.Office.Interop.Outlook.Application app = null;
Microsoft.Office.Interop.Outlook.NameSpace session = null;
Microsoft.Office.Interop.Outlook.MailItem item = null;
try {
app = new Microsoft.Office.Interop.Outlook.Application();
session = app.Session;
item = session.OpenSharedItem("C:\\test.msg") as Microsoft.Office.Interop.Outlook.MailItem;
string body = item.HTMLBody;
int att = item.Attachments.Count;
(item as Microsoft.Office.Interop.Outlook._MailItem).Close(Microsoft.Office.Interop.Outlook.OlInspectorClose.olDiscard);
(app as Microsoft.Office.Interop.Outlook._Application).Quit();
} finally {
if(item != null) {
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(item);
}
if(session != null) {
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(session);
}
if(app != null) {
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(app);
}
}
Je ne connais pas les spécificités des interopes du bureau COM, mais voici quelques codes suggéré d'un Article MSDN . Il suggère que la double collecte / attente et le nettoyage des pointeurs aide à nettoyer Wrapper RCW.
while (Marshal.ReleaseComObject(app) > 0) { }