Windows-Forms-Anwendung, wie Google Chrome mit mehreren Prozessen
Gibt es eine Möglichkeit, mit C# zum erstellen einer container-Anwendung, wo jeder Reiter ist tatsächlich seine eigenen Prozess wie bei Google chrome?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie die SetParent Win32-aufrufen, um dies zu tun, aber es ist wirklich mit Problemen behaftet. Ich hatte genug Probleme, immer alles schön zu arbeiten mit Fenstern aus verschiedenen Anwendungsdomänen - da würde es noch mehr Schwierigkeiten mit den ganzen zusätzlichen Prozesse.
Grundsätzlich gibt es möglicherweise eine Menge Kommunikation zwischen den beiden Prozessen - Dinge wie Größenänderung können sich sehr schmerzhafte, als auch, was passiert, wenn das Kind app verlassen will etc. Es ist alles machbar, aber ich würde sehr genau überlegen, bevor es zu tun. Der browser macht es sehr viel Sinn (disclaimer: ich arbeite für Google), aber für die meisten anderen apps ist es wirklich nicht der Mühe Wert.
(Sind die "tabs", die Sie erstellen möchten ist .NET-Anwendungen? Wenn dem so ist, wie ich sage, dies wird deutlich leichter - und ich kann Ihnen einen großen Hinweis ist, dass jedes UI laufen sollte seine eigenen UI-thread aus in seine eigene AppDomain. Sie bekommen wirklich seltsame Effekte, wenn Sie dies nicht tun!)
Für diejenigen von Ihnen interessiert, die bei der Umsetzung von multi-Prozess-Anwendungen, ich schrieb einen Artikel darüber auf meiner Webseite: Multi-Prozess C# - Anwendung wie Google Chrome.
Habe ich C# - code. Es wurde getestet, mit zu arbeiten .NET 2.0, .NET 3.0 und .NET 3.5.
Named pipes: Wie Prozesse miteinander zu verbinden
Da deine Frage konkret gefragt, etwa Google Chrome, sollten Sie wissen, dass Chrome verwendet named pipes zur Kommunikation zwischen Prozessen.
In der C# - Quellcode den ich oben erwähnt habe gibt es 2 Dateien: PipeServer.cs & PipeClient.cs. Diese 2 Dateien sind dünne Wrapper, der Named Pipes, Windows-API. Es ist gut getestet, weil Hunderttausende von Menschen unsere Produkte verwenden. Also Stabilität & Robustheit waren eine Voraussetzung.
, Wie wir mit den multi-Prozess-design
Nun, da Sie haben alle die Stücke, um das puzzle, lassen Sie mich Ihnen sagen, wie wir die Verwendung von Multi-Prozess-design in unserer app.
Unser Produkt ist eine komplette updater-Lösung. Das heißt, es gibt ein Programm baut, dass der update-patches (nicht relevant für die Diskussion), einen standalone-updater-Programm (wyUpdate - auch open source), und eine Automatische Updater Kontrolle, dass unsere Benutzer auf Ihre C# oder VB.NET Formen.
Wir die Verwendung von named pipes für die Kommunikation zwischen den standalone-updater (wyUpdate) und der Automatische Updater Steuerung sitzt auf dem Programm-Formular. wyUpdate Berichte die Fortschritte der Automatische Updater, und der Automatische Updater kann sagen, wyUpdate zu stornieren Fortschritt, um den Download zu starten, starten Sie das extrahieren, etc.
In der Tat genaue das named pipes-code, den wir verwenden, ist enthalten in dem Artikel den ich oben erwähnt habe: Multi-Prozess C# - Anwendung wie Google Chrome.
Warum sollten Sie nicht verwenden die multi-Prozess-design
Als Jon Skeet oben erwähnt, sollten Sie haben eine spezifische Notwendigkeit für die multi-Prozess-Modell. In unserem Fall wollten wir halten den updater komplett getrennt von Ihrem Programm. Dieser Weg, wenn der updater irgendwie abgestürzt ist, Ihr Programm würde unversehrt bleiben. Wir wollten auch nicht zu duplizieren, die unseren code an 2 stellen.
Dass gesagt wird, auch mit unserer bewährten Named Pipes-wrapper, inter-Prozess-Kommunikation ist hart. So vorsichtig.
Überprüfen dieser Beitrag auf dem Chromium Blog. Nur ein Prozess, der verantwortlich ist für die Darstellung auf dem Bildschirm.
Mein Produkt, WindowTabs.com, Art der dies tut. Sie müssen Win32 - - ich schlage vor, Sie vermeiden, mit SetParent, weil Sie am Ende anbringen der thread-Eingang. Zeichnen Sie stattdessen die tabs über dem Fenster und verwenden Sie SetWindowPos zu verschieben, die windows als eine Gruppe. Auch einige third-party-controls wie Infragistic funktionieren nicht korrekt, wenn Sie als übergeordnete form auf Win32-Ebene.
System.Add-in-APIs eingeführt .NET 3.5 können Sie mithilfe von UI-Steuerelemente in getrennten AppDomains. Mit einigen hoop springen, können Sie in separaten Prozessen zu.
Unterstützt wird dies navtively in WPF. Finden Sie in der MSDN-Beispiel Add-In liefert eine UI.
Verwendung von Windows Forms -, es sieht nicht wie es nativ möglich mit dem System.Add-In-APIs. Sehen dieser Beitrag von einem System.Add Architekten Jack Gudenkauf.
Allerdings gibt es einen workaround für WinForms. Sie können diese Arbeit mit einem kleinen hacken: die BCL-team blog Unterstützung für Windows Forms-in-System.Add Hosts und Add-ins
Ja. Sie laichen können neue Prozesse mit System.Diagnostik.Prozess. Mit irgendeiner form von inter-Prozess-Kommunikation (IPC), .NET Remoting Sie können beispielsweise die Kommunikation zwischen Prozessen. Und dann können Sie das parent-das Fenster/Formular von deinem neuen Prozess zu einem Fenster (tab) Ihres ersten Prozesses, so scheint es.
Ohne sich zu tief in das extensibility-stack verwenden, können Sie die System.Addin - namespace, um eine Anwendung zu erstellen, die inhärent erstellen können add-ins als visuelle einzelnen Registerkarten und stellen Sie die einzelnen Registerkarten/add-in-out-Prozess und das ist ein Verhalten aus der box.
Wird es die gleiche Funktionalität wie die chrome-tabs.