Wie gebe ich DLLs frei ?

JJB

Cogito ergo brumm
Tach !

ich benutze eine DLL (A) über eine statische Funktion. Diese statische Funktion hat eine eigene Klasse und steht allein in einer DLL (B), welche von einem Programm (C) aufgerufen wird.

Nun holt sich das Programm (C) die DLL (A) und ruft die statische Funktion der DLL (B) auf, welche auf (A) zugreift. Danach hat weder das Programm (C) einen Verweis auf die DLL (B) noch die statische Funktion in (B) einen Verweis auf die DLL (A).

Wieso kann das Programm (C) die DLL (A) nicht löschen ? Niemand braucht sie oder hat einen Verweis darauf ?

Anm: Kein Projekt hat eine lokale Kopie einer anderen DLL, alles ist nur über Verweise geregelt und zum Startzeitpunkt gibt es keine DLL (A).

Ansatz ?: Marshal.ReleaseComObject

Hat jemand eine Idee ?

MFG JJB
 
Zuletzt bearbeitet:

JJB

Cogito ergo brumm
Code:
namespace mylocalNamespace
{
   public class myLocalClass
   {
      [...]

      private myType CallFktFromExternalDll()
      {
         myType myReturnValue = new myType();
      
         // Erstelle vorrübergehende Domain für AssemblyLoader und führe AssemblyLoader aus
         AppDomain aDomain = AppDomain.CreateDomain("myExternalNamespace");
         AssemblyLoader aAssemblyLoader = (AssemblyLoader)aDomain.CreateInstanceAndUnwrap("mylocalNamespace", "mylocalNamespace.AssemblyLoader");
         myReturnValue = aAssemblyLoader.LoadAndRun(myParameters);
         AppDomain.Unload(aDomain);
         
         return myReturnValue;
      }
   }
   
   //[Serializable]
   public class AssemblyLoader : MarshalByRefObject
   {
      public myType LoadAndRun(myParameterType myParameters)
      {
         Assembly aAssembly = Assembly.Load("myExternalNamespace");
         Type aType = aAssembly.GetType("myExternalNamespace.myExternalClass");
         MethodInfo aMethod = aType.GetMethod("myExternalFunction");

         // Parameter und Funktionsaufruf
         object[] aParamArray = {myParameters};
         myType myReturnValue = (myType)aMethod.Invoke(Activator.CreateInstance(aType), aParamArray);

         return myReturnValue;
      }
   }
}

Die Funktion myExternalNamespace.myExternalClass.myExternalFunction() sollte static sein.

Thema geschlossen
 
Zuletzt bearbeitet: