Laden...

AppDomain && ShadowCopy, wie könnte das gehen ?

Erstellt von Primusio vor 17 Jahren Letzter Beitrag vor 17 Jahren 3.460 Views
P
Primusio Themenstarter:in
71 Beiträge seit 2006
vor 17 Jahren
AppDomain && ShadowCopy, wie könnte das gehen ?

Hallöchen Community,
hab da ein kleines Problem, würd gern für eines meiner Programme ein AutoUpdater programmieren um die Usability zu erhöhen. Erst hab ich mir überlegt, die komplette Anwendung so dynamisch aufzubauen, mit AppDomains und ShadowCopy, jedoch übersteigt das noch etwas (ziemlich sogar X() meinen Horizont.

Daher hab ich gedacht, da mach ich lieber einen kleinen Autoupdater, der das Programm ja schließen kann um die dll's freizugeben. Nur muss der Updater selbst natürlich dynamisch sein, da es sein kann, dass er sich selbst aktualisieren muss.

Also ich hab jetzt eine .exe "WindowsApplicationHost" und eine .dll "Core" (danke an das Eisbärblog) 👍
In der .exe steht jetzt im grund enur dieser Code


        public static void Main()
        {
            Assembly coreAssembly = Assembly.LoadFrom("Core.dll");
            
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run((Form)Activator.CreateInstance(coreAssembly.GetType("Core.Program")));
        }

Und in der .dll ist halt mein Fenster was dort initialisiert wird. Also soweit klappt es auch aber wie bekomme ich es jetzt hin, dass er dieses in eine Appdomain mit shadowcopy kopiert, damit die .dll freigegeben wird ?

Leider finde ich in diesem Forum nur die "forgeschrittenen" Beiträge, ich kann mir aber nicht vorstellen, dass es so extrem schwierig ist. Es sind sicher nur ein paar kleine Zeilen Code, jedoch finde ich da bisher wirklich nix oder habe nicht richtig gesucht, daher vielleicht kann mir jemand mit einem Stichwort, Link oder Code aushelfen. Wäre euch sehr dankbar.

MfG
Primusio

P
Primusio Themenstarter:in
71 Beiträge seit 2006
vor 17 Jahren

Also hab jetzt einen neuen Versuch gestartet, allerdings sagt er mir
"System.IO.FileNotFoundException"
bei folgenden Code


       public static void Main()
        {
            AppDomainSetup setup = new AppDomainSetup();
            setup.ApplicationBase = Application.StartupPath;
            setup.ShadowCopyFiles = "yes";

            AppDomain newDomain = AppDomain.CreateDomain("Testdomain", null, setup);

            Assembly coreAssembly = newDomain.Load("Core.dll");
            
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run((Form)Activator.CreateInstance(coreAssembly.GetType("Core.Program")));
        }

Der Fehler kommt in der Zeile "newDomain.Load("Core.dll")" weiß leide rnicht woran es liegt, hoffe jemand kann mir helfen.

MfG
Primusio

P
Primusio Themenstarter:in
71 Beiträge seit 2006
vor 17 Jahren

Na supi, man sollte natürlich wissen, dass er keine Dateierweiterung ".dll" haben will, kaum die 4 Zeichen weggelassen läuft der Code zwar wieder, allerdings ist die .dll Datei immernoch reserviert.

Das heißt, ich hab zwar den Assembly in eine neue AppDomain geladen allerdings kann ich die Core.dll immernoch weder löschen noch überschreiben. Hat dafür jemand eine Lösung ?

6.862 Beiträge seit 2003
vor 17 Jahren

Des Property ShadowCopyFiles musst du auf "true" setzen, nicht auf "yes".

Baka wa shinanakya naoranai.

Mein XING Profil.

P
Primusio Themenstarter:in
71 Beiträge seit 2006
vor 17 Jahren

Danke, man sollte halt nicht darauf vertrauen das ein Copy&Paste Quellcode immer richtig ist.

Leider genau das selbe Resultat, Programm läuft aber .dll nicht freigegeben.
Ich verzweifle daran noch.

1.820 Beiträge seit 2005
vor 17 Jahren

Hallo!

Nach AppDomain.UnLoad(newDomain) kannst du wieder voll über die DLL verfügen, da mit diesem Befehl alle verwendeten Resourcen freigegeben werden.

Nobody is perfect. I'm sad, i'm not nobody 🙁

N
2 Beiträge seit 2004
vor 17 Jahren

Das geht eben nicht!!!!


Gruss
na_ich2000

M
1.439 Beiträge seit 2005
vor 17 Jahren
T
512 Beiträge seit 2006
vor 17 Jahren

Ich wette das geht deswegen nicht, weil dein "normales" Programm die DLL schon geladen hat. Also die AppDomain in der das Programm startet.

e.f.q.

Aus Falschem folgt Beliebiges

1.820 Beiträge seit 2005
vor 17 Jahren

Hallo!

Ich hab's heute in meinem PlugIn-Manager geschafft, PlugIns zu laden, und z.B. die Assembly zu löschen, umbenennen, o.ä., während sie geladen ist.
Man muss einfach nur beim Programmstart

AppDomain.CurrentDomain.SetShadowCopyFiles();

aufrufen. Damit werden die Assemblies in einen Cache kopiert und von dort gestartet.
Das Problem ist nun allerdings, dass diese Methode veraltet ist, und ich nicht weis, wie man das spiegeln sonst aktivieren kann ( AppDomain.CurrentDomain.SetupInformation.ShadowCopyFiles = bool.TrueString; hat nicht funktioniert ). Vielleicht hat hier noch jemand eine Idee ...

Nobody is perfect. I'm sad, i'm not nobody 🙁