05. juni 2005 - 00:50Der er
16 kommentarer og 1 løsning
Problemer med at cast et object efter load via appDomain
Hey
Jeg har et lille prob.
Dette her kan jeg godt: ------ o = appDomain.CreateInstance("Test_Server", "Server.ServerJob1", false,BindingFlags.CreateInstance, null, new object[] {}, null, null, null );
Form x = (Form)o.Unwrap(); x.Show(); ------
Men dette kan jeg ikke: ------
o = appDomain.CreateInstance("Test_Server", "Server.ServerJob", false,BindingFlags.CreateInstance, null, new object[] {}, null, null, null );
ServerJob test = (ServerJob)o.Unwrap(); test.TestMe(); <--- Specified cast is not valid. ------
Og det er selv om at jeg har denne type object i min dll som jeg loader dynamisk.. har ingen ide til hvorfor den ikke vil, hvad er det ved en Form den forstår og ikke min egen type objekt?
hey.. i har fuldstændigt ret, det er naturligvis ServerJob test = (ServerJob)o.Unwrap(); som giver fejl.. :) det blev lidt sent i går. Nej ServerJob extender ikke MarshalByRefObject, har du et eksempel?
Synes godt om
Slettet bruger
05. juni 2005 - 12:51#5
hmm.. har lige fundet ud af at selv om jeg laver appDomain.CreateInstance i stedet for Assembly.Load så kan jeg stadig ikke unloade min dll.. det var det som var formålet med det hele.. nogen som har en ide til hvad jeg kan gøre?
Klasser du tilgår i et andet app domain skal arve fra MarshalByRefObject.
Med appDomain.CreateInstance kan du godt unloade din klasse. Men ServerJob test = (ServerJob)o.Unwrap() har jo også ServerJob klassen i current app domain, hvilket nok ikke er meningen.
2) lade de klasser du loader implementere et interface som er fast og kendt i main app domain
Synes godt om
Slettet bruger
05. juni 2005 - 15:36#10
jeg har lige prøvet det med at lave et interface til dem, men får igen fejl med at de ikke kan caste det. kan du give et eksempel på hvordan jeg skal lave det? på forhånd tak
using System; using System.Reflection; using System.CodeDom.Compiler;
using Microsoft.CSharp;
using E.Interface;
namespace E.Demo { class MainClass { public static void Main(string[] args) { string code1 = @" using System; using E.Interface;
public class X : MarshalByRefObject, IX { public override string ToString() { return ""X1""; } public string WhoAmI() { return ""I am X1""; } }"; string code2 = @" using System; using E.Interface;
public class X : MarshalByRefObject, IX { public override string ToString() { return ""X2""; } public string WhoAmI() { return ""I am X2""; } }"; ICodeCompiler c = new CSharpCodeProvider().CreateCompiler(); CompilerParameters cp = new CompilerParameters(); cp.ReferencedAssemblies.Add("System.dll"); cp.ReferencedAssemblies.Add("IX.dll"); cp.GenerateInMemory = false; cp.OutputAssembly = "X.dll"; CompilerResults cr1 = c.CompileAssemblyFromSource(cp, code1); AppDomain d1 = AppDomain.CreateDomain("Dom1"); object x1 = d1.CreateInstanceAndUnwrap("X", "X"); Console.WriteLine(x1); Console.WriteLine(((IX)x1).WhoAmI()); AppDomain.Unload(d1); CompilerResults cr2 = c.CompileAssemblyFromSource(cp, code2); AppDomain d2 = AppDomain.CreateDomain("Dom2"); object x2 = d2.CreateInstanceAndUnwrap("X", "X"); Console.WriteLine(x2); Console.WriteLine(((IX)x2).WhoAmI()); AppDomain.Unload(d2); } } }
C:\e6>csc /t:library IX.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:\e6>csc /r:IX.dll E.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:\e6>e X1 I am X1 X2 I am X2
Synes godt om
Slettet bruger
05. juni 2005 - 17:02#15
Hey.. det ser ud til at virke.. jeg tester lige med det jeg havde lavet før.. du må lige oprette et svar hvis du vil have de points.. og ellers rigtigt mange tak for hjælpen :)
Synes godt om
Slettet bruger
05. juni 2005 - 17:16#16
Hey Arne.. Har lige lavet min egen kode om til det du sendte, og det virker som det skal :) så kan jeg endelig komme videre med resten af mit system.. igen mange tak.. og også tak de andre gange du har hjulpet :)
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.