Ich habe eine Anwendung, die IMPLICITLY öffnet ein Handle auf eine DLL/Datei. Irgendwann in der Anwendung möchte ich dieses Handle freigeben. Wie kann ich es tun? Meine Anwendung ist in C#.Wie man einen Griff durch C# freigibt?
Antwort
Verwendung PInvoke wenn Sie eine Prozedur, die Sie
[System.Runtime.InteropServices.DllImport("Kernel32")]
private extern static Boolean CloseHandle(IntPtr handle);
Aber wie finde ich den Griff, den ich schließen muss. Ich kenne nur den Dateinamen. Der Handle, den mein Prozess für diese Datei geöffnet hat, ist unbekannt. – Poulo
Verwenden Sie die Process-Klasse zum Starten von exe? –
Verwenden Sie einfach die Methode Dispose oder Close der Klasse, die das Handle geöffnet hat.
Ich kenne keinen einfachen Weg. Übermäßige implizite Dateisperrung ist etwas, das ich über Windows immer nicht mochte.
Wenn Sie die Datei ersetzen müssen, kann MoveFileEx dies beim nächsten Start tun. Sie würden es verwenden, um das Original umzubenennen oder zu löschen, und dann etwas anderes in seinen Platz umzubenennen. http://msdn.microsoft.com/en-us/library/aa365240(VS.85).aspx http://www.pinvoke.net/default.aspx/kernel32/MoveFileEx.html
Wenn Sie es nicht direkt mit der API zu verwirren wollen ist Movefile in der Sysinternals Suite, die macht das gleiche: http://technet.microsoft.com/en-us/sysinternals/bb897556.aspx
Oder Sie können die Datei ein anderes Programm Zugriff haben, wenn Ihr Programm isn‘ t läuft.
Es gibt Möglichkeiten, eine Liste von Handles pro Prozess zu erhalten, wenn Sie wirklich versuchen, das Handle zu schließen, was höchstwahrscheinlich nur Ihr Programm zum Absturz bringen würde, wenn .NET versucht, wieder darauf zuzugreifen. Es ist nicht schön, und das Beispiel ist C++: http://www.codeguru.com/forum/showthread.php?t=176997
Was genau Sie versuchen zu tun? Wenn Sie eine Assembly laden möchten, um damit etwas zu tun und diese dann vollständig zu entladen, müssen Sie sich darauf verlassen, eine neue App-Domain zu erstellen.
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);
}
Werfen Sie einen Blick auf diesen Beitrag für mehr http://blogs.msdn.com/suzcook/archive/2003/07/08/57211.aspx
Oder, wenn Sie nur Sorgen um halten die Datei gesperrt sind, können Sie Schatten Kopieren verwenden könnte. Das wird eine Kopie der Datei auf der Festplatte erstellen und von den neuen Speicherort laden. Die Originaldatei wird von diesem Ladevorgang nicht gesperrt. Um zu tun, setzen Sie AppDomainSetup.ShadowCopyFiles auf "True" beim Erstellen der AppDomain oder Set AppDomain.ShadowCopyFiles auf True , nachdem es bereits erstellt wurde.
- 1. Wie man einen Block freigibt
- 2. Wie man einen Schlüssel drückt und ihn mit C# freigibt?
- 3. Wie man json_object freigibt?
- 4. Wie man eine Schnittstelle freigibt?
- 5. Wie man mit Kanban freigibt?
- 6. Wie man einen WPF mit einer Datenbank freigibt
- 7. Wie man Speicher von std :: deque freigibt?
- 8. wie man malloc außerhalb der Funktion freigibt
- 9. Wie man Android MediaPlayer richtig freigibt
- 10. Wie man Webinhalte zwischen Eclipse-Projekten freigibt
- 11. mysql: Wie man Speicherplatz freigibt (innodb)
- 12. Wie man pygame in eine Webseite freigibt
- 13. Griff einen fehlerhaften Ausdruck
- 14. Problem in Griff PNG durch die PIL
- 15. Reflection C# - Wie man Griff zu Klasse mehrere Eigenschaften tief
- 16. Wie implementiert man einen Wiedereintrittssperrmechanismus in Ziel-c durch GCD?
- 17. Kann ich einen Griff bekommen - Quelle?
- 18. C# 4.0 - Wie Griff Optional String-Parameter
- 19. Griff STRG + C auf Win32
- 20. Wie man ein Objekt, das in einem Datensatz ist, freigibt?
- 21. Set Knopf Griff in C#
- 22. Wie man den verbrauchten Speicher durch die webEngine im javaFX Browser freigibt
- 23. Wie man ein Element in einem Zeigervektor freigibt?
- 24. Wie man ein Objekt von einem Array freigibt?
- 25. Wie man eine generische TList <T> freigibt?
- 26. Wie man KEYPress in autopy oder pyautogui NICHT freigibt?
- 27. durch einen C Looping # Sammlungen
- 28. Wie man einen Port in .NET ... freigibt, nachdem ein TCPListener eine erforderliche Sache vom Fernclient
- 29. Wie erstellt man einen TStringList-Nachkomme mit Owner, der die TStringList automatisch freigibt?
- 30. Immer den Griff des Fensters in C#
Was ist die betreffende Datei schließen möchten? Ist es eine Ressource oder eine referenzierte Assembly? Sie scheinen zu wissen, warum es geöffnet ist, was der beste Hinweis darauf ist, wofür es verwendet wird und wann es geschlossen wird. Pflege lass uns rein? –
Alles 280Z28 sagte ... plus "Schattenkopie" ;-p –
Ok. Meine Anwendung verwendet ein GUI-Automatisierungstool, um einige Tests an einem Installer durchzuführen. Ich starte das Installationsprogramm, (xyx.exe) verwende Code, der vom Automatisierungstool erzeugt wurde, um GUI-Operationen durchzuführen, die die Software mit dem Installer aktualisieren. Währenddessen ist ein Handle auf 'xyz.exe' geöffnet, der nicht geschlossen wird. Dies ist das Handle, das ich schließen möchte. Der generierte Code enthält alle statischen Member. Daher kann ich keine Dispose- oder Close-Methode aufrufen. Ich lade auch die Assembly nicht, daher kann ich keine andere App-Domain erstellen und sie nach der Verwendung wieder entfernen. – Poulo