Die Entladung der geladenen Assembly mit Assembly.LoadFrom()
Brauche ich, um die Zeit zu überprüfen Betrag ausführen GetTypes() nach dem laden der dll.
Der code ist wie folgt.
Assembly assem = Assembly.LoadFrom(file);
sw = Stopwatch.StartNew();
var types1 = assem.GetTypes();
sw.Stop();
double time1 = sw.Elapsed.TotalMilliseconds;
Möchte ich entladen und neu laden der dll, auf die Uhr schauen, um zu verbringen, läuft GetTypes() wieder.
- Wie kann ich das entladen?
assem = null
ist gut genug? - Gibt es einen expliziten Weg, um zu rufen garbage collector zurückfordern, die der Ressource zugeordnet assem?
Die kurze Antwort ist, dass Sie nicht entladen Assemblys; Sie kann nur entladen AppDomains. Es gibt eine Reihe von Einschränkungen auferlegt, wenn Sie das laden einer Assembly in neue AppDomain, so dass ich empfehlen, tun Sie etwas Forschung auf dem Thema, um ein Gefühl dafür bekommen, wie Sie funktionieren. Das heißt, Sie können das laden der gleichen Versammlung wieder, auch wenn der Vorherige war auch nicht entladen.
Hat jemand probiert, was passiert, um die Assemblys, wenn Sie null? Sie erhalten garbage Collection oder befreit in irgendeiner Weise ? Ich bin besorgt über die Erinnerung.
Ein sehr related post hier.
Hat jemand probiert, was passiert, um die Assemblys, wenn Sie null? Sie erhalten garbage Collection oder befreit in irgendeiner Weise ? Ich bin besorgt über die Erinnerung.
Ein sehr related post hier.
InformationsquelleAutor prosseek | 2011-06-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leider kann man nicht entladen einer assembly, sobald es geladen wird. Aber Sie können entladen einer AppDomain. Was Sie tun können ist, erstellen Sie eine neue Anwendungsdomäne (AppDomain.Optionen "createdomain" (...) ), laden Sie die Montage in dieser Anwendungsdomäne, mit ihm zu arbeiten, und dann das entladen der AppDomain, wenn nötig. Beim entladen der AppDomain, in der alle Assemblys wurden, geladen werden, entladen werden. (Siehe Referenz)
Aufruf der garbage collector, die Sie verwenden können,
GC ruft den Finalizer in einem hintergrund-thread, das ist, warum Sie müssen warten und call Collect() erneut, um sicherzustellen, dass Sie alles gelöscht.
InformationsquelleAutor slfan
Können Sie verwenden eine andere AppDomain?
In meinem Fall die "FileNotFoundException" verursacht wurde durch eines der referenzierten Assemblys. Ich landete mit Montage.ReflectionOnlyLoadFrom in Verbindung mit einer Methode, die Lasten alle referenzierten Assemblys in der Reflexion nur Kontext.
aus irgendeinem Grund lädt die assembly mit dem gleichen Namen (wie bereits erwähnt) in das Verzeichnis der Anwendung, eher als die Baugruppe in das genannte Verzeichnis...keine Ahnung, warum dies passieren könnte ??
Leider funktioniert dies nicht .NET Core als Anwendungsdomänen sind nicht implementiert.
InformationsquelleAutor Rene de la garza
Anstatt
LoadFrom()
oderLoadFile()
können SieLoad
mitFile.ReadAllBytes()
. Mit dieser es nicht verwenden Sie die assembly-Datei, aber es zu Lesen und lese-Daten.Dein code sieht dann so aus
Vom hier Wir können nicht entladen Sie die Datei nur, wenn alle Domänen enthalten, die durch ihn entladen werden.
Hoffe, das hilft.:)
Assembly.LoadFrom()
. Ich bearbeitet Ihren Beitrag, aber jemand hat es geändert zurück.Tatsächlich, Sie können, und es funktioniert sehr gut. Ich laden von dlls als plugins dynamisch und dann, wenn Ihr die moment, Sie deinstallieren, ich sollte löschen Sie die Datei. Die Hardik Methode funktioniert perfekt, keine AppDomain ärger oder so etwas. roli09 sollten Sie den code testen, bevor Sie jegliche änderungen an Kommentaren, das sollte die richtige Antwort gewesen,
Es funktioniert, weil Hardik ist mit
Assembly.Load
und nichtAssembly.LoadFrom
mehr.Hat dieser Leck-Speicher, wenn
assem
ist auf null gesetzt?richtig ist: Die Montage der Load-Methode enthält einen Verweis auf die Datei geladen ist, verhindert, dass die Datei nicht überschrieben oder gelöscht von einem anderen Prozess. Es ist also ein cleverer workaround zu verwenden das File-Objekt die Methode ReadAllBytes, die nicht im Besitz einer Referenz. Sobald diese bytes werden ausgelesen und die Datei wird geschlossen, das Ergebnis wird an der Montage der Load-Methode. Sehr clever!
InformationsquelleAutor Hardik
Kann man nicht entladen der assembly aus der aktuellen Anwendungsdomäne. Aber Sie können neue AppDomain laden von Assemblys in es, execute code in der neuen AppDomain und entfernen Sie es. Überprüfen Sie den folgenden link: MSDN
InformationsquelleAutor Yuriy Rozhovetskiy
Assembly nicht entladen werden, leider, und darüber hinaus - wenn Sie mit appdomains - dann wird es verhindern, dass Sie, um die Kommunikation mit api ' s /Baugruppen Ihre main Anwendung.
Beste Beschreibung für das problem kann hier gefunden werden:
Skript-Hosting-Richtlinie
http://www.csscript.net/help/Script_hosting_guideline_.html
Wenn Sie möchten, führen Sie C# - code, ohne die Kommunikation zu Ihren wichtigsten Anwendung - bester Ansatz ist die Integration von C# - Skripting-API:
https://github.com/oleg-shilo/cs-script/tree/master/Source/deployment/samples/Hosting/Legacy%20Samples/CodeDOM/Modifying%20script%20without%20restart
Und für die integration benötigen Sie folgende Pakete:
C# script:
http://www.csscript.net/CurrentRelease.html
Visual studio-Erweiterung:
https://marketplace.visualstudio.com/items?itemName=oleg-shilo.cs-script
Wenn jedoch Sie kommunizieren möchten, mit Ihrem C# - Skript zu Ihrer Anwendung dann mit der gleichen appDomain mit Montage name ständig ändert, ist nur so im moment - aber leider frisst ram und Festplattenspeicher.
Code-Beispiel, wie es getan werden kann - finden Sie hier:
https://github.com/tapika/cppscriptcore
CsScriptHotReload.sln
Und hier ist das demo-video:
https://drive.google.com/open?id=1jOECJj0_UPNdllwF4GWb5OMybWPc0PUV
InformationsquelleAutor TarmoPikaro