DLL nach FreeLibrary ersetzen
-
Hallo zusammen,
ich möchte eine plugin DLL, die mit LoadLibrary geladen wird, nach dem Entladen mittels FreeLibrary löschen bzw. ersetzen können.
FreeLibrary klappt soweit nur kann ich die Datei nicht löschen - Windows blockiert sie solange meine Applikation noch läuft - wieso?
In der DLL wird eigentlich nichts gemacht (sie besteht aus zwei leeren Funktionen - eine load und eine unload Funktion).
Hat da jemand einen Tipp was sich da machen lässt?Danke & Gruß
Mark
-
Warum sollte man das denn überhaupt wollen?

-
Zum Beispiel dann, wenn man einen Fehler entdeckt oder neue Funktionalität hinzufügt und man die Applikation nicht beenden will sondern lediglich das Plugin neu laden will...?
-
Hm. Also wenn der Programmierer einen Fehler entdeckt und seine DLL/Plugin neu kompiliert, finde ich es schonv vertretbar, dass die das Plugin ladende Anwendung neu gestartet wird. Aber naja...

-
Bitte nicht die Motivation in Frage stellen - vielleicht hat man sich was dabei gedacht

-
Bist Du sicher, dass nicht öfters als einmal LoadLibrary aufgerufen wurde?
-
Hi Martin,
ja bin ich. Kann es sein, dass es unter Windows gar nicht geht*?
*Ich habe gelesen, dass Windows die DLLs automatisch cached wenn sie einmal geladen wurden. Man kann das mit "AutoUnloadDll" in der Registry ausschalten, aber das beinflusst dann jede DLL und das ist mehr als unschön.
Habt ihr vielleicht einen anderen Vorschlag, wie ich mein Vorhaben realisieren kann?
-
Benenne diue DLL um oder lege sie in ein anderes Verzeichnis

-
@pub00515:
Ich *weiss* dass das geht, da das genau der Weg ist über den wir im laufenden Betrieb Plugins unseres Serverprogrammes austauschen.
Wenn es bei dir nicht geht machst du vermutlich etwas falsch.Guck mal ob du den PROCESS_DETACH Aufruf (DllMain) bekommst.
Wenn nicht hast du wahrscheinlich wirklich ein LoadLibrary übersehen.
BTW: ich weiss nicht ob man die DLL *sofort* nach dem FreeLibrary löschen kann, wir machen das immer erst später per Hand (neue Versionen bekommen nen neuen Namen - über .ini File halt). Wobei "später" auch nur ein paar Sekunden später sein kann.
Was ganz sicher geht ist was Jochen geschrieben hat: die DLL umbenennen. Du kannst unter Windows nämlich auch DLLs umbenennen die gerade in Verwendung sind.
-
p.S.:
Dieses DLL Caching und "AutoUnloadDll" haben nur mit Explorer Extensions zu tun, nicht mit normalen DLLs.
-
Ansonsten mal mit dem ProcessExplorer von Sysinternals gucken, wer die DLL noch geladenn hat.
Simon
-
Hallo Leute
ich habe die Ursache gefunden: Bei der C DLL handelt es sich um eine C++ DLL wo auch CLI aktiviert ist. Das brauche ich, damit ich eine C# DLL laden kann. Leider wird die C DLL per FreeLibrary nicht released wenn man FreeLibrary benutzt. Gibt es da einen anderen Weg um CLI explizit entladen zu können?
Sobald ich CLI deaktiviere, funktioniert FreeLibrary wie erwartet.Danke und Gruß
Mark
-
IMHO nein. Ist einmal .NET am laufen kann man dies nicht mehr abschalten...