Come rilasciare un handle tramite C #?
-
22-07-2019 - |
Domanda
Ho un'applicazione che apre IMPLICITAMENTE un handle su una dll / file. Ad un certo punto dell'applicazione, voglio rilasciare questo handle. Come posso farlo? La mia domanda è in C #.
Soluzione
usa PInvoke se hai un gestore che vuoi chiudere
[System.Runtime.InteropServices.DllImport("Kernel32")]
private extern static Boolean CloseHandle(IntPtr handle);
Altri suggerimenti
Cosa stai esattamente cercando di fare? Se vuoi caricare un assembly per fare qualcosa con quello e poi scaricarlo completamente, devi fare affidamento sulla creazione di un nuovo dominio di app.
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);
}
Dai un'occhiata a questo post per ulteriori informazioni, http: //blogs.msdn.com/suzcook/archive/2003/07/08/57211.aspx
Oppure, se sei solo preoccupato mantenendo il file bloccato, è possibile utilizzare copia shadow. Questo farà una copia del file su disco e caricarlo da la nuova posizione. Il file originale non sarà bloccato da quel carico. A fallo, imposta AppDomainSetup.ShadowCopyFiles to & Quot; allineare " durante la creazione di AppDomain o impostare AppDomain.ShadowCopyFiles su true dopo che è già stato creato.
Usa semplicemente il metodo Dispose o Close della classe che ha aperto l'handle.
Non conosco un modo semplice. L'eccessivo blocco implicito dei file è qualcosa che non ho mai apprezzato di Windows.
Se è necessario sostituire il file, MoveFileEx può farlo al prossimo avvio. Lo useresti per rinominare o eliminare l'originale, quindi rinominare qualcos'altro al suo posto. http://msdn.microsoft.com/en-us /library/aa365240(VS.85).aspx http://www.pinvoke.net/default.aspx/kernel32/MoveFileEx. html
Se non vuoi fare confusione con l'API direttamente c'è MoveFile nella suite SysInternals che fa lo stesso: http://technet.microsoft.com/en-us/sysinternals/bb897556.aspx
Oppure puoi avere un altro programma che accede al file quando il tuo programma non è in esecuzione.
Esistono modi per ottenere un elenco di handle per processo, se si desidera davvero provare a chiudere l'handle, il che molto probabilmente causerebbe l'arresto anomalo del programma se .NET tentasse di accedervi nuovamente. Non è carino e l'esempio è C ++: http://www.codeguru.com/forum/showthread.php?t= 176997