Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
SplashScreen in eingener AppDomain
syn87
myCSharp.de - Member



Dabei seit:
Beiträge: 87

Themenstarter:

SplashScreen in eingener AppDomain

beantworten | zitieren | melden

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();
private Nachricht | Beiträge des Benutzers
syn87
myCSharp.de - Member



Dabei seit:
Beiträge: 87

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo syn87,

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

herbivore
private Nachricht | Beiträge des Benutzers
syn87
myCSharp.de - Member



Dabei seit:
Beiträge: 87

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Tarion
myCSharp.de - Member



Dabei seit:
Beiträge: 381

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
syn87
myCSharp.de - Member



Dabei seit:
Beiträge: 87

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers