Frage

Ich habe eine Anwendung, die implizit einen Griff auf einer DLL / Datei öffnet. An einem gewissen Punkt in der Anwendung, mag ich diesen Griff lösen. Wie kann ich es tun? Meine Anwendung ist in C #.

War es hilfreich?

Lösung

verwenden PInvoke, wenn Sie einen Handler, die Sie schließen möchten

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

Andere Tipps

Was genau wollen Sie tun? Wenn Sie eine Assembly laden möchten mit, dass ein paar Sachen zu tun, und es dann vollständig zu entladen, müssen Sie sich auf die Schaffung einer neuen Anwendungsdomäne verlassen.

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);
}

Haben Sie einen Blick auf diesen Beitrag für mehr http: //blogs.msdn.com/suzcook/archive/2003/07/08/57211.aspx

  

Oder, wenn Sie nur besorgt sind über   die Datei gesperrt zu halten, könnten Sie   Schattenkopien. Das wird eine Kopie   die Datei auf der Festplatte und laden Sie es aus   die neue Position. Die Originaldatei   wird nicht von dieser Last arretiert werden. Zu   das tun, setzen   AppDomainSetup.ShadowCopyFiles zu   „True“ bei der Erstellung des Anwendungsdomäne oder   Set AppDomain.ShadowCopyFiles auf true   nachdem es ist bereits erstellt wurde.

Verwenden Sie einfach das Entsorgen oder Close-Methode der Klasse, die den Griff geöffnet.

Ich weiß nicht, einen einfachen Weg. Übermäßige implizite Sperren von Dateien ist etwas, was ich über Windows immer unbeliebt haben.

Wenn Sie die Datei ersetzen müssen, MoveFileEx kann es beim nächsten Neustart tun. Sie würden es verwenden, um die ursprünglichen benennen oder zu löschen, und dann etwas anderes in seinen Platz umbenennen. http://msdn.microsoft.com/en-us /library/aa365240(VS.85).aspx http://www.pinvoke.net/default.aspx/kernel32/MoveFileEx. html

Wenn Sie mit der API zu verwirren wollen nicht direkt gibt es Movefile in der Sysinternals Suite, die macht das gleiche: http://technet.microsoft.com/en-us/sysinternals/bb897556.aspx

Sie können auch die Datei ein anderes Programm Zugriff haben, wenn Ihr Programm läuft nicht.

Es Möglichkeiten ist eine Liste von Handles pro Prozess zu bekommen, wenn Sie wirklich versuchen wollen den Griff zu schließen, was höchstwahrscheinlich nur Ihr Programm abstürzen, wenn .NET versucht, wieder auf ihn zugreifen. Es ist nicht schön, und das Beispiel ist C ++: http://www.codeguru.com/forum/showthread.php?t= 176.997

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top