Frage

Wir haben eine .Net-Anwendung, von dem ein C ++ COM-Komponente instanziiert wird. Wir laden Sie die COM-Komponente von einem Kind Formularfenster. Es gibt eine gemeinsame Ressource, die durch die Net-Anwendung bearbeitet wird, die durch die COM inturn dll verwendet wird zu starten.

Wenn die folgende Abfolge von Schritten durchgeführt werden:
1. Instantiate COM-Komponente in dem neuen Kind Fenster    Die COM-Komponente instanziiert, und wird durch das Kind Form verwendet, und nach verwendet wird, wird es auf NULL gesetzt wird, in der Hoffnung, dass die COM-Komponente entladen werden würde.
2. Halten Kind Fenster öffnen und bearbeiten Sie dann die Ressource
3. Nun gehen und „refresh“ die Form, eine neue COM-Instanz zu erstellen, die refelection der geändertenen Ressource zu sehen -. Aber die Ressource nicht aktualisiert

Wir haben auch Marshal.ReleaseComObject Methode, aber ohne Erfolg. Bitte Beratung.

Keine korrekte Lösung

Andere Tipps

Sobald eine DLL in eine .NET AppDomain geladen wird, ist es nicht possble eine DLL zu zwingen, entladen werden. Es ist eine bedauerliche Einschränkung der CLR. Wenn Sie unbedingt die DLL müssen entladen Sie die folgende tun können.

  1. Erstellen Sie eine neue AppDomain
  2. Laden Sie das DLL in die neue DLL
  3. Sie die Arbeit in der neuen AppDomain
  4. Entlasten Sie die neue AppDomain

Wenn eine DLL nur in einer AppDomain geladen ist, wird die AppDomain Entladen als auch die DLL entladen. So wird dies erhalten die entladen DLL. Allerdings ist es eine ziemlich Schwergewicht Antwort.

COM-Objekt und DLL sind zwei verschiedene Dinge, auch wenn man in einem anderen befindet. Bestimmte Hacks sind möglich, aber viel bessere Lösung ist es, diesen Teil in einer vernünftigen Weise neu zu schreiben, die nicht auf DLL Entladung angewiesen ist.

Diskussion auf clrInterop beschreibt ganz in der Nähe, was Sie in Ihrer Frage skizziert. Der Garbage Collector nicht entladen die native DLL. Ich zitiere:. "Es könnte sehr gefährlich sein für clr, dies zu tun, weil es vielleicht ein anderer Code sein (auch nativen Code), die auf dieser dll hängt Wenn Sie versichern tun, dass DLL nicht mehr verwendet wird, eine Windows-API wie Free Aufruf kann am einfachsten Weg, um die dLL zu entladen. "

So werden Sie Free Interop müssen und verwenden, die die native DLL zu entladen. Obwohl ich hinzufügen möchte. Nicht tun, wenn Sie eine Lösung finden versuchen, wo Sie die DLL nicht entladen müssen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top