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 #.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top