Laden...

SplashScreen in eingener AppDomain

Erstellt von syn87 vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.429 Views
S
syn87 Themenstarter:in
87 Beiträge seit 2008
vor 14 Jahren
SplashScreen in eingener AppDomain

Hallo zusammen,

ja ich hab schon ein bisschen im Forum rumgeguckt, aber ich glaube meine Idee für einen SplashScreen ist noch nicht vertreten.

Ich würde den SplashScreen gern als einzelne Exe kompilieren und ihm dann das zu startende Programm und das SplashBild als Parameter übergeben.

Beim Start der SplashScreen-Exe sollte dann eine neue

AppDomain

erstellt werden. Über diese kann man an das Event

AssemblyLoad

anknüpfen.

Ja sicherlich is das eine Geschmacksfrage, aber ich find es ziemlich 'stylisch' wenn da die geladenen Assemblys angezeigt werden 😃

Problem bereitet mir aber das Beenden des SplashScreen Programms. Hier sollte eigntl die SplashScreen Assembly als Referenz zum Zielprojekt angegeben werden können, und der SplashScreen per SplashScreen.Close() beendet werden können. Ich hab schon viel probiert, aber nichts hat wirklich funktioniert. Process IDs sind gleich und den Thread über die ManagedThreadID bekomm ich nich (zumindest weiss ich nicht wie). Frage bleibt also, wie sollte das Close() aussehn.

Ja für Ideen bin ich offen 😃


            SplashScreen splash = new SplashScreen();
            new Thread(delegate()
            {
                AppDomain mainAppDomain = AppDomain.CreateDomain("MainApp");
                mainAppDomain.AssemblyLoad += (s, e) => { };
                //MessageBox.Show(e.LoadedAssembly.GetName().Name);
                mainAppDomain.ExecuteAssembly(args[0]);
            }).Start();

S
syn87 Themenstarter:in
87 Beiträge seit 2008
vor 14 Jahren

Kaum zu glauben, aber ich hab schonmal eine Moeglichkeit gefunden, mit der es funktioniert:


        static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new SplashScreen());

        }

        public SplashScreen()
        {
            InitializeComponent();
            Thread mainApp = new Thread(delegate()
            {
                AppDomain mainAppDomain = AppDomain.CreateDomain("MainApp");
                mainAppDomain.AssemblyLoad += (s, e) => { };
                //MessageBox.Show(e.LoadedAssembly.GetName().Name);
                Mutex mut = new Mutex(true, "LOCAL//Client");
                mainAppDomain.ExecuteAssembly("Client.exe");
            });

            Shown += (s, e) =>
            {
                mainApp.Start();
                Thread.Sleep(2000);
                Mutex mut = new Mutex(false, "LOCAL//Client");
                mut.WaitOne();
                Close();
            };
        }

Ich möchte aber trotzdem noch die Frage an euch richten, was ihr fuer verbesserungswuerdig haltet.

LG

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo syn87,

statt Thread.Sleep solltest du einen Timer verwenden. Siehe auch [FAQ] Warum blockiert mein GUI?

herbivore

S
syn87 Themenstarter:in
87 Beiträge seit 2008
vor 14 Jahren

Okay wird gemacht. Sonst noch irgendwelche Einwände?:) Was mich etwas stoert, ist dass der Prozess als SplashScreen.exe weiterlaeuft, aber ich glaube das ist nicht zu verhindern oder? Ansonsten muesste ich ja einen neuen Process starten und dann haette ich wieder das Problem mit dem AssemblyLoad.

T
381 Beiträge seit 2009
vor 14 Jahren

Wieso packst du die SplashScreen Klasse nicht in eine DLL? Das macht alles viel einfacher und hat auch keine Nachteile.

Du rufst dann auch nur SplashScreen.Show() und SplashScreen.Close() auf.
Was ist an deinem Ansatz das "Stylische"? Der Enduser sieht davon nix...

S
syn87 Themenstarter:in
87 Beiträge seit 2008
vor 14 Jahren

Packt man das ganze in eine DLL sind bereits zahlreiche AssemblyLoad Events gefeuert wurden. D.h. man sieht im Splashscreen nicht alle geladenen Assemblys. Es gibt natuerlich auch die Liste geladener Assemblies, aber ich wollte es halt genau in dem moment anzeigen, wo es auch geschieht.. Bei einer Applikation die aus mehreren DLLs besteht ist diese Variante für mich wesentlich angenehmer als immer SetText("Assembly xy") zu schreiben, hatte ich ja bereits geschrieben.