これは前に説明したことは分かっていますが、満足のいく答えが見つかりませんでした。C#でCOMオブジェクトを解放します
私は以下のように開いて、ディスプレイを呼び出している電子メールファイル(.msg)を持っています。
oApp = new Microsoft.Office.Interop.Outlook.Application();
mail = (Microsoft.Office.Interop.Outlook.MailItem)oApp.Session.OpenSharedItem(fileName);
mail.Display(false);
oApp = null; // do I need to release this object ?
ユーザはそれを閉じて再度開くことができます。彼らが "再オープン"をクリックする前に、私はウィンドウがまだ存在するかどうかをチェックし、そうであればそのウィンドウにSetForeground(hwnd)を送信します。そうでなければ、それはユーザーがそれを閉じたことを意味するので、mailItemオブジェクトを解放して再び開くだけです。
public static void ReleaseCOMObject(Microsoft.Office.Interop.Outlook.MailItem item) {
int r = System.Runtime.InteropServices.Marshal.ReleaseComObject(item);
while (r != 0) {
r = System.Runtime.InteropServices.Marshal.ReleaseComObject(item);
}
}
再度同じファイルを開こうとするとそれは "時々" "使用中のファイルの例外"をスローするので、私はMailItemをリリースしているにもかかわらず、それは適切にリリースされていないと思う。
リリースが適切に行われるようにするにはどうすればよいですか。ファイルのクローズと再オープンは非常に一般的なシナリオです。
すべてのポインタは非常に役に立ちます。
参照カウンターをインクリメントするときに "解放"し、他の参照を解放すると問題が発生することがあります。 – Matthew