У меня есть класс, который создает экземпляр COM exe из процесса. КлассC# cleanup неуправляемые ресурсы, когда процесс убит
public class MyComObject:IDisposable
{
private bool disposed = false;
MyMath test;
public MyComObject()
{
test = new MyMath();
}
~MyComObject()
{
Dispose(false);
}
public double GetRandomID()
{
if (test != null)
return test.RandomID();
else
return -1;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (test != null)
{
Marshal.ReleaseComObject(test);
test = null;
}
disposed = true;
}
}
и я называю это следующим образом
static void Main(string[] args)
{
MyComObject test = new MyComObject();
MyComObject test2 = new MyComObject();
//Do stuff
test.Dispose();
test2.Dispose();
Console.ReadLine();
}
сейчас, это очищает мой COM объект, когда программа выполняется нормально. Однако, если я закрываю программу в середине ее выполнения, фреймворк никогда не вызывает код, который освобождает мой неуправляемый объект. Это справедливо. Однако есть ли способ заставить программу очистить себя, даже если ее убили?
EDIT: это не выглядит перспективным с жестким убийством из
:(менеджера задача
это также не работает. Серверы COM остаются в живых, если я убиваю процесс в середине используемого блока. – Steve
Как вы убиваете процесс? Вы ввели какие-либо записи в свои блоки блокировки, чтобы узнать, что происходит? –
(Простое закрытие программы с нормальным выключением должно быть прекрасным. Прекращение его из диспетчера задач, скорее всего, будет более неприятным.) Правильно ли работает сервер COM, если вы закрываете программу «обычным» способом? –