¿Cómo liberar un identificador a través de C #?
-
22-07-2019 - |
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 #.
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