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
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
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 ?
Des Property ShadowCopyFiles musst du auf "true" setzen, nicht auf "yes".
Baka wa shinanakya naoranai.
Mein XING Profil.
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.
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 🙁
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
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 🙁