DLL nach FreeLibrary ersetzen



  • 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 😉


  • Mod

    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


  • Mod

    IMHO nein. Ist einmal .NET am laufen kann man dies nicht mehr abschalten...


Anmelden zum Antworten