2009-12-15 12 views
7

कोई विचार क्यों COM कोड COM इंटरऑप के माध्यम से बनाई गई Outlook 2007 प्रक्रिया से बाहर नहीं निकलता है?सी # आउटलुक 2007 COM इंटरऑप एप्लिकेशन बाहर नहीं निकलता है!

Microsoft.Office.Interop.Outlook.Application app = new Microsoft.Office.Interop.Outlook.Application(); 

var item = app.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); 
System.Runtime.InteropServices.Marshal.ReleaseComObject(item); 

(app as Microsoft.Office.Interop.Outlook._Application).Quit(); 
System.Runtime.InteropServices.Marshal.ReleaseComObject(app); 
System.Diagnostics.Debugger.Break(); 

लगभग एक समान टुकड़ा वर्ड का उपयोग कर काम करता है, तो मुझे आश्चर्य है अगर मैं कुछ साफ करने के लिए भूल रहा ...

उत्तर

10

आप एक 3 COM वस्तु अपने कोड में संदर्भित है: app.Session। यह भी सही ढंग से जारी किया जाना चाहिए। इस कोड का प्रयास करें:

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); 
    } 
} 
+0

यह काम किया। सत्र एक नामस्थान वस्तु है। धन्यवाद :) – Nikolaos

+0

कोई समस्या नहीं है। मैंने कोड में उस वर्ग का नाम बदल दिया है। डबल संग्रह सुझाव और डिबगिंग चेतावनी के लिए –

0

(app.Quit के बाद के बाद) का प्रयास करें;

// ReleaseComObject(xApp); 
GC.WaitForPendingFinalizers(); 
GC.Collect(); 
+0

फिर भी वहाँ सुस्त ... धन्यवाद। – Nikolaos

+2

गलत तरीके से चारों ओर। एकत्र() पहले होना चाहिए। –

+0

@nobugz: वही परिणाम। बाहर निकलने के बाद भी प्रक्रिया()। – Nikolaos

0

बजाय इस कोशिश करें, यह मेरे लिए काम करता है, वहां कुछ सेकंड की देरी होगी इससे पहले कि यह जाता है:

app.Quit(); // 
System.Runtime.InteropServices.Marshal.ReleaseComObject(app); 
GC.Collect(); 
GC.WaitForPendingFinalizers(); 
2

मैं कार्यालय कॉम Interops की बारीकियों पता नहीं है, लेकिन यहाँ कुछ कोड एक MSDN article से सुझाव दिया है। यह सुझाव देता है कि पॉइंटर्स के डबल संग्रह/प्रतीक्षा और समाशोधन आरसीडब्ल्यू रैपर क्लीनअप के साथ मदद करता है।

item = null; 
app.Quit(); 
app = null; 
GC.Collect(); 
GC.WaitForPendingFinalizers(); 
GC.Collect(); 
GC.WaitForPendingFinalizers(); 

यूआरएल हालांकि यह भी पता चलता है कि

while (Marshal.ReleaseComObject(app) > 0) { } 

जो मैं व्यक्तिगत रूप से दृढ़ता से इसका मदद कर सकते हैं, तो के खिलाफ सलाह देंगे, जैसा कि आप मूल रूप से बस (है कि आपके AppDomain के लिए RCW नष्ट कर दिया है के रूप में लेख बताते हैं)।

[संपादित करें: इसके अलावा नेट कचरा कलेक्टर बहुत अलग है जब एक डिबगर बनाम रिहाई कोड अंदर व्यवहार करती है, तो डिबगर के इस बाहर का परीक्षण बहुत महत्वपूर्ण है] वैसे भी

+2

+1। – Nikolaos

संबंधित मुद्दे