Wie ein Griff durch C # veröffentlichen?
-
22-07-2019 - |
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 #.
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