Pregunta

Tengo una aplicación que IMPLÍCITAMENTE abre un identificador en un archivo dll /. En algún momento de la aplicación, quiero liberar este identificador. ¿Cómo puedo hacerlo? Mi aplicación está en C #.

¿Fue útil?

Solución

use PInvoke si tiene un controlador que desea cerrar

[System.Runtime.InteropServices.DllImport("Kernel32")]
private extern static Boolean CloseHandle(IntPtr handle);

Otros consejos

¿Qué estás tratando de hacer exactamente? Si desea cargar un ensamblaje para hacer algunas cosas con eso y luego descargarlo por completo, debe confiar en crear un nuevo dominio de aplicación.

public static void Main(string[] args)
{
AppDomain appDomain = AppDomain.CreateDomain("NewAppDomain");
appDomain.DoCallBack(new CrossAppDomainDelegate(AsmLoad));

// At this point, your assembly is locked, you can't delete

AppDomain.Unload(appDomain);
Console.WriteLine("AppDomain unloaded");

//You've completely unloaded your assembly. Now if you want, you can delete the same

}

public static void AsmLoad()
{
Assembly assembly = Assembly.LoadFrom(@"c:\Yourassembly.dll");

//Loaded to the new app domain. You can do some stuff here
Console.WriteLine("Assembly loaded in {0}",AppDomain.CurrentDomain.FriendlyName);
}

Eche un vistazo a esta publicación para obtener más información, http: //blogs.msdn.com/suzcook/archive/2003/07/08/57211.aspx

  

O, si solo te preocupa   manteniendo el archivo bloqueado, podría usar   copia de sombra Eso hará una copia   del archivo en el disco y cárguelo desde   La nueva ubicación. El archivo original   no será bloqueado por esa carga. A   hacer eso, establecer   AppDomainSetup.ShadowCopyFiles a   " verdadero " al crear el dominio de aplicación o   establecer AppDomain.ShadowCopyFiles en verdadero   después de que ya se haya creado.

Simplemente use el método Dispose o Close de la clase que abrió el identificador.

No conozco una manera fácil. El bloqueo implícito excesivo de archivos es algo que siempre me ha disgustado de Windows.

Si necesita reemplazar el archivo, MoveFileEx puede hacerlo en el próximo arranque. Lo usaría para cambiar el nombre o eliminar el original y luego cambiar el nombre de otra cosa en su lugar. http://msdn.microsoft.com/en-us /library/aa365240(VS.85).aspx http://www.pinvoke.net/default.aspx/kernel32/MoveFileEx. html

Si no desea meterse con la API directamente, hay MoveFile en la suite SysInternals que hace lo mismo: http://technet.microsoft.com/en-us/sysinternals/bb897556.aspx

O puede hacer que otro programa acceda al archivo cuando su programa no se esté ejecutando.

Hay formas de obtener una lista de identificadores por proceso, si realmente desea intentar cerrar el identificador, lo que probablemente bloqueará su programa si .NET intenta acceder de nuevo. No es bonito, y el ejemplo es C ++: http://www.codeguru.com/forum/showthread.php?t= 176997

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top