Tengo una clase que crea una instancia de un exe COM fuera de proceso. La clase esC# limpiar los recursos no administrados cuando se mata el proceso
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;
}
}
y me llaman de la siguiente manera
static void Main(string[] args)
{
MyComObject test = new MyComObject();
MyComObject test2 = new MyComObject();
//Do stuff
test.Dispose();
test2.Dispose();
Console.ReadLine();
}
ahora, esto se limpia mi objeto COM cuando el programa se ejecuta normalmente. Sin embargo, si cierro el programa en el medio de su ejecución, el framework nunca llama al código que libera mi objeto no administrado. Lo cual es justo. Sin embargo, ¿hay alguna manera de obligar al programa a que se limpie a sí mismo aunque haya sido asesinado?
EDIT: no se ve prometedor desde una muerte dura de la administrador de tareas :(
que tampoco funciona. Los servidores COM se mantienen activos si elimino el proceso en el medio del bloque de uso. – Steve
¿Cómo estás matando el proceso? ¿Has puesto algún registro en tus bloques de disposición para ver qué está pasando? –
(Simplemente cerrar el programa con un apagado normal debería estar bien. Terminarlo desde el Administrador de tareas es probable que sea más desagradable.) ¿El servidor COM se apaga correctamente si cierra el programa de una manera "normal"? –