20. juli 2009 - 14:29Der er
15 kommentarer og 2 løsninger
Reflection - load og unload af dll
Jeg har brug for at mit program loader og unloader en dll runtime. Der skal kaldes 2 static metoder i dll-filen og så skal den unloades så den kan slettes.
Jeg har skrevet dette og det virker fint til at loade filen og kalde metoderne, men jeg kan ikke finde ud af at unloade den igen. Jeg har læst mig frem til at man skal loade filen ind i et andet AppDomain, men jeg kan ikke findes ud af gøre det.
Nogen der kan strikke noget sammen der loader filen og kalder de 2 metoder og unloader den igen?
Filen eller assemblyen eller en af dens afhængigheder kunne ikke indlæses. Det angivne assemblynavn eller den angivne kodebase var ugyldig. (Undtagelse fra HRESULT: 0x80131047)
Kan du poste nogle links jeg kan læse for at forstå det, eller lave det så det passer til den opstilling jeg skrev?
Jeg er heller ikke sikkert på hvordan jeg kalder de metoder jeg gerne vil kalde på den måde du skrev
static byte[] loadRawFile(string filename) { FileStream fs = new FileStream(filename, FileMode.Open); byte[] buffer = new byte[(int)fs.Length]; fs.Read(buffer, 0, buffer.Length); fs.Close();
return buffer; }
Der står at man skal bruge "The display name of the assembly" i Load, men jeg skal jo på en eller anden måde ha fortalt hvor filen ligger før jeg bare kan skrive assembly name?
Hvis assembly ikke ligger et sted hvor CLR vil lede efter den skal du nok bruge en anden Load.
Den udfra byte[] bør være fin nok.
Hvis der ikke er noget som helst som referer til den assembly burde AppDomain Unload smide den ud.
Og at den bliver brugt af en anden process skylde jo ikke den her kode. AppDomain og CLR aner intet om filen. Det er kun din loadRawFile som ved at de bytes kommer fra den fil og den lukker filen igen.
Jeg har prøvet at skrive dette og så ændre lidt i din AssemblyLoader klasse, men nu får jeg en SerializationException. Jeg er ikke så sejl til reflection, så er lidt på bar bund igen.
string newVersion; if (!loader.LoadAssembly(dllPath, out filesToBackup, out newVersion)) { return ""; }
AppDomain.Unload(domain);
arne_v >>
Tænkte også at der måtte være noget andet der holder filen åben, men hvis jeg ikke kalder den metode der læser fra dll filen, så virker det. Den eneste gang metoden bruger filen er i den loadRawFile og den skulle gerne lukke filen igen.
Så ved ikke om det kan lade sig gøre at det er noget med de assembly?
Høh.. Det er lidt svært at se hvorfor den smider den, hvis ikke man kan se hvordan den nye version af AssemblyLoader ser ud :)
Husk når man kommunikerer mellem to forskellige AppDomains så bruges remoting. Så enten skal din klasse være serialiserbar eller også skal den nedarve fra MarshalByRefObject.
I øvrigt har Arne ret - noget andet må holde på dit assembly. Har du prøvet at sætte shadowCopy til true på det nye appdomain? Så vil runtime'n ihvertfald ikke holde på dit assembly.
Jeg fik løst SerializationException ved at sætte [Serializable] over den. Nu kalder den igen dll'en som den skal, men filen er stadig låst når jeg vil slette den. Hvis jeg ikke kalder 'updateXML' fra main så er filen ikke låst til sidst, så det er helt sikkert en af disse 2 metoder der låser den? Eller har jeg overset noget?
Jeg fik det aldrig til at virke helt.. nogen gange virkede det og andre gange ikke.. har rodet med det alt for meget nu, finder på en anden løsning, lav et svar hvis i føler for point (bvli og arne_v)
bvli >> Hvis du vil ha dine point, så skrive så laver jeg en ny tråd.
Synes godt om
Ny brugerNybegynder
Din løsning...
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.