I in Tests bemerkt, dass mehrere Anrufe zu dem folgenden Code einen Speicherverlust erzeugt:Wie kann ich eine Baugruppe freigeben, nachdem ich sie mit Reflektion geladen habe?
object obj = Activator.CreateInstance(Type.GetType(arg2.DeclaringType.FullName));
arg2.Invoke(obj, new object[] { arg3 });
Für den obigen Code, arg2
ist MethodInfo
Typ; arg3
ist string[]
Auch wenn ich obj = null;
nach dem Invoke hinzufügen, es scheint, dass GAC dieses Objekt nicht für die Bereinigung sammeln. (Ja, ich weiß, dass das Setzen eines Objekts auf null eine schlechte Entschuldigung für dispose() ist, da es sich jedoch um eine generische Methode handelt, kann displace() in der Klasse verfügbar sein oder nicht und mit Assemblys getestet werden, die über dispose verfügen (sie werden nach der Verwendung nicht entladen)
Ich habe in Erwägung gezogen, einen Cache-Mechanismus zu verwenden, bei dem die geladene Assembly in einem Wörterbuch für nachfolgende Suchvorgänge gespeichert wird. Es gibt jedoch keine Garantie, dass GAC nicht kommt und es später aufräumt Objekt im Wörterbuch unbrauchbar (unter anderen Katastrophen).
Wie kann ich ein Entladen der Klasse erzwingen (ähnlich wie ich es erzwingen kann, indem ich Activate
laden), wenn ich damit fertig bin?
Möchten Sie jetzt eine Assembly in der AppDomain freigeben oder eine Instanz eines Objekts entfernen? Sie sind Titel und Text sind irreführend – Mark
'obj = null' ist im Allgemeinen sinnlos für eine lokale Variable. Der JIT und der GC arbeiten zusammen, um die Lebensdauer der Referenz zu "verstehen", und sobald kein anderer Teil des Codes * von obj liest, wird das Objekt, auf das es Bezug nimmt, nicht mehr gespeichert. Keine Hilfe von Ihnen ist erforderlich. –
@Damien_The_Unbeliever - Ich sollte wahrscheinlich ein wenig über meine Tests klären. Ich habe die Benutzeroberfläche geöffnet und die Aktion ausgeführt, die den obigen Code (click event) mehrfach aufgerufen hat. Mit jedem Klick wurde die Speichernutzung erhöht. Ich konnte es gehen lassen (langsam) von 36MB bis 100MB verwendet nach mehreren Klicks. Die einzige Aktion, die der Klick ausführt, ist das Laden dieser Assembly, das Spiegeln der Methode und das Beenden. –