Avatar billede thjal Nybegynder
01. juni 2007 - 19:00 Der er 10 kommentarer og
1 løsning

exe benytter dlls - hvordan kan jeg ændre dllerne "on the fly"

Jeg ved hvordan jeg får en exe til at benytte dller. Så langt så godt.
Men er det muligt at få exen til at benytte "opdaterede" dller uden at exen skal genstartes? Jeg mener - det jeg ønsker er at test1.exe benytter test2.dll men jeg vil så gerne lave nogle ændringer i test2.dll (jeg ændre ikke på metode kaldet i det jeg ikke ændre på parameterlisten eller retur typen).
Men det bringer mig alligevel til et bi-spørgsmål: Jeg ville meget gerne have et interface i exen som test2.dll så har en class der benytter - men det får jeg ikke lov til for når jeg prøver at inkluderer exe projektet som reference i dll projektet får jeg at vide at det må man ikke da det ikke er en dll. Hvordan kommer jeg rundt om det - hvis det overhovedet er muligt?

Hvis der er behov for et kode eksempel vil jeg gerne give det - på efterspørgelse :)
Avatar billede arne_v Ekspert
01. juni 2007 - 19:19 #1
C# tillader at du builder en DLL med reference til en DLL, men Visual Studio supporterer
det ikke.

Nemmeste workaround er at putte det interface i en separat DLL.

Du kan ikke genloade en ny version af en klasse med samme navn medmindre du
har loadet den i et AppDomain og unloader dette.

Jeg kan finde nogle eksempler paa dette frem, hvis du er interesseret.
Avatar billede thjal Nybegynder
01. juni 2007 - 22:55 #2
arne_v, du mener at det er muligt at builde en dll med reference til en exe ikke? Men jeg kan næsten regne ud at jeg så skal benytte CSC i kommand prompten... Jeg er med på dit workaround og sådan kommer jeg nok også til at lave det.
Jeg er interesseret - men jeg er allermest interesseret i hvis du har et eksempel der bygger på to forskellige assemblies.
Avatar billede arne_v Ekspert
03. juni 2007 - 02:36 #3
ups - jo "... til en EXE"
Avatar billede arne_v Ekspert
03. juni 2007 - 02:38 #4
Avatar billede arne_v Ekspert
03. juni 2007 - 02:39 #5
ix.cs
-----

namespace E.Interface
{
    public interface IX
    {
        string WhoAmI();
    }
}


e.cs
----

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);
        }
    }
}
Avatar billede arne_v Ekspert
03. juni 2007 - 02:42 #6
Eksemplet compiler også koden on the fly.

Du kan spare alt med compilering hvis DLL eksisterer on disk.
Avatar billede mh6000 Nybegynder
04. juni 2007 - 08:39 #7
Hvis du styre versions nummeret i dll manuelt, burde du kunne overskrive den gamle dll med den nye og så genstarte programmet.
Avatar billede thjal Nybegynder
04. juni 2007 - 10:04 #8
mh6000 - Det jeg vil undgå er at genstarte exen (programmet). Men stadig skifte dllen ud (der af frasen "on-the-fly). dllen skal selvfølgelig være serialized for at komme nogenlunde tilbage til samme satus som tidligere.
Avatar billede mh6000 Nybegynder
04. juni 2007 - 10:46 #9
Jeg tager lige brillerne på :-) Sorry.
Avatar billede arne_v Ekspert
07. august 2007 - 22:46 #10
All set ?
Avatar billede thjal Nybegynder
24. september 2007 - 23:41 #11
Jeg er ikke helt sikker på om alt er som det skal være - men jeg lukker spørgsmålet. Jeg har ikke fået det testet og kommer nok heller ikke lige til at gøre det, da projektet er blevet ændret.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester