освободить ресурсы, занимаемые CDO.MessageClass
От: greenpci  
Дата: 23.01.07 06:06
Оценка:
Использую COM класс CDO.MessageClass для создания контакта в
общей папке exchange. Вот такой, примерно, мой код:
ADODB.ConnectionClass con = new ADODB.ConnectionClass();
con.Provider = "ExOLEDB.DataSource";
con.Open(connPath, "", "", -1);
CDO.MessageClass msg = new CDO.MessageClass();
ADODB.RecordClass rec = new ADODB.RecordClass();
rec.Open(
  url, con,
  ADODB.ConnectModeEnum.adModeReadWrite,
  ADODB.RecordCreateOptionsEnum.adFailIfNotExists,
  ADODB.RecordOpenOptionsEnum.adOpenSource,
  "", ""
  );
msg.OpenObject(rec, "_Record");
msg.AddAttachment(tmpSubFolder + "\\" + attName, "", "");
msg.SaveToObject(rec, "_Record");
rec.Close();
con.Close();


после этого мне нужно удалить приатаченный файл
File.Delete(tmpSubFolder + "\\" + attName);

эта строке не выдает exception, но файл не удаляется на самом деле, так как он занят процессом.
Файл будет удален, только когда процесс его освободит. Меня такое поведение не устраивает, так как я хочу сразу удалить папку,
в которой лежит это файл, а там уже выпадает exception
Directory.Delete(tmpSubFolder);


Я перепробовал различные варианты чтобы освободить файл. Интерфейс CDO.IMessage не имеет метода Close. Я пробовал присваивать msg = null;
так же со всеми остальными объектами (rec, con).
Нашел вариант для сокращения счетчика ссылок на COM объект до нуля:
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(msg);
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(bp);

но он так же не освобождает файл тут же.
Файл освобождается сборщиком мусора только через какое-то время, а мне нужно тут же.
Пробовал применять GC.Collect();
Что интересно, на виртуальной тестовой машине, где было 512 метров оперативки, это сработало. Файл тут же был освобожден.
А на рабочем сервере (1024Мб) с такой же конфигурацией и версиями программ, файл не освобождается.
Кроме того, GC.Collect() применять не красиво. Наверняка это дорогостоящая операция, а этот участок кода вызывается довольно часто.
При каждом сохранении пользователем документа.
Остановился на том, что чищу дирректории при следующем Application_start.
Кто что посоветует?
Re: освободить ресурсы, занимаемые CDO.MessageClass
От: AlexZu Россия  
Дата: 23.01.07 14:43
Оценка:
Здравствуйте, greenpci, Вы писали:

1) Для каждого COM-объекта после использования вызовите Marshal.ReleaseComObject.
2) Если какой-либо из методов COM-объекта возвращает COM-объект, даже если вы его не используете см. 1)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.