03. oktober 2005 - 15:42Der er
32 kommentarer og 1 løsning
load en dll runtime
Jeg har en app på nuværende tidspunkt med en masse "plugins" i deres eget namespace.
Nu vil jeg gerne have disse "plugins" ud af min main app. så jeg har mine plugins i hver deres assenbly, med hver deres app.config. osv. så det er muligt at loade/unloade dem hvis der skal rettes i dem uden at hele min main app skal lukkes ned..
bare lige for en ordens skyld: din dll bliver ikke unloaded - den ligger stadig i hukkomelsen. Det er muligt du ikke refererer til den fra din main-app. Hvis den skal unloades korrekt, så skal du over i noget teknik a' la fusion.
fusion bliver brugt af IIS (som jo loader og unloader assemblies ved ændringer) kald på tværs af af domains sker ikke direkte. Det kan fx gøres vha remoting, proxies eller kopiering af objekter mellem appdomains (i alle tilfælde på bekostning af performance).
sidder lige og leger med unload af appdomain og finder denne tråd igen :). uanseet exception handling. virker dette ikke som jeg vil ha det til..
AppDomain d = AppDomain.CreateDomain("MyDomain"); object o = d.CreateInstanceAndUnwrap("MyAssembly", "MyClass"); (o as IPlugin).Test; AppDomain.Unload(d);
Assembly bliver loaded og Test bliver executed (Printer "hello") AppDomain.Unload(d); unloader ikke jeg har kunnet finde rundt omkring at CreateInstanceAndUnwrap loader objected i både det nye appdomain & det default. det har noget med referencer og Remoting at gøre, men jeg er ikke 100.
dllBytes is a byte[] with the dll file loaded in mem. comming in as an arg to the method.
dette resulterer i samme situation..
jeg får "Insufficient state to deserialize the object. More information is needed." hvis jeg har dll'en liggende alle andre steder end bin/Debug folderen
Hvordan kan man gøre det "rigtigt" så dll'en kan slettes efter unload og ikke nødvendigvis behøver at ligge i samme folder som de andre dll'er...
Jeg ar fundet frem til at når du laver et nyt domain og loader dll'en fra det domain bliver den loaded i både de default og det nye.
Jeg har så lavet en "wrapper" til at håndtere mine remote loadede dll'er en LocalLoader og en RemoteLoader Jeg laver så et doamin pr, dll, via LocalLoader, den loader så min RemoteLoader, som loader dll'en.. puuhhh..
Og til Arne så fastholder jeg at det er en tilsnigelse med de 3 linier kode. Netop med de problemstillinger der opstår ved kald imellem domains. Din løsning i indlæg #1/2 er den forbindelse lidt tyndt.
C:\>csc /t:library x1.cs Microsoft (R) Visual C# .NET Compiler version 7.10.6001.4 for Microsoft (R) .NET Framework version 1.1.4322 Copyright (C) Microsoft Corporation 2001-2002. All rights reserved.
C:\>csc /t:library x2.cs Microsoft (R) Visual C# .NET Compiler version 7.10.6001.4 for Microsoft (R) .NET Framework version 1.1.4322 Copyright (C) Microsoft Corporation 2001-2002. All rights reserved.
C:\>csc /t:exe loader.cs Microsoft (R) Visual C# .NET Compiler version 7.10.6001.4 for Microsoft (R) .NET Framework version 1.1.4322 Copyright (C) Microsoft Corporation 2001-2002. All rights reserved.
Arne - til gengæld tager jeg hatten af for dit end-to-end eksempel!
Jeg har ikke nogen problem med at undlade at udkommentere: d.AssemblyLoad += new AssemblyLoadEventHandler(LoadEvent); // causes MyDom to load loader.exe - comment out to avoid
men Dump gør at loader.exe bliver loaded.... lidt sært.... muligvis kan det have noget at gøre med, at de assemblies der bliver hentet fra MyDom bliver eksekveret i loader.exe's domain når "FullName" property'en bliver skrevet i Console.WriteLine("-" + a.FullName);
using System; using System.Reflection; using System.Diagnostics;
public interface IDebug { void Debug(); }
public class AppDomainLog { public static void LoadEvent(object sender, AssemblyLoadEventArgs args) { Console.WriteLine("Load : " + ((AppDomain)sender).FriendlyName + " <- " + args.LoadedAssembly.FullName); } }
public class XBase : MarshalByRefObject, IDebug { public void Debug() { AppDomain d = AppDomain.CurrentDomain; Console.WriteLine(d.FriendlyName + " contains:"); foreach(Assembly a in d.GetAssemblies()) { Console.WriteLine("-" + a.FullName); } } }
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.