Aplikacja Windows Forms, taka jak Google Chrome, z wieloma procesami

Czy Jest jakiś sposób na użycie C# do zbudowania aplikacji kontenerowej, w której każda karta jest właściwie własnym procesem, jak w Google chrome?

Author: Peter Mortensen, 2008-10-13

7 answers

Możesz użyć SetParent Win32, aby to zrobić, ale jest to naprawdę obarczone problemami. Miałem wystarczająco dużo problemów, aby wszystko działało ładnie przy użyciu windows z różnych AppDomain - byłoby jeszcze więcej trudności z całymi dodatkowymi procesami.

Zasadniczo istnieje potencjalnie dużo komunikacji wymagane między dwoma procesami - rzeczy takie jak zmiana rozmiaru może stać się dość bolesne, jak również co się dzieje, jeśli aplikacja dziecka chce zamknąć itp. To wszystko da się zrobić, ale ja bym zastanów się bardzo uważnie, zanim to zrobisz. Dla przeglądarki to ma wiele sensu (zastrzeżenie: pracuję dla Google), ale dla większości innych aplikacji to naprawdę nie jest warte wysiłku.

(Są "zakładki", które chcesz utworzyć rzeczywiste aplikacje. NET? Jeśli tak, jak mówię, staje się to znacznie łatwiejsze - i mogę dać Ci dużą wskazówkę, która polega na tym, że każdy interfejs powinien uruchomić swój własny wątek z własnego AppDomain. Dostajesz naprawdę dziwne efekty, jeśli tego nie zrobisz!)

 24
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-09 14:35:35

Dla tych z was zainteresowanych rzeczywistą implementacją aplikacji wieloprocesowych napisałem artykuł na jej temat NA MOJEJ STRONIE: Wieloprocesowa aplikacja C# jak Google Chrome.

Dodałem działający kod C#. Został przetestowany pod kątem współpracy z.NET 2.0,. NET 3.0 i. NET 3.5.

Nazwane rury: jak procesy ze sobą rozmawiają

Ponieważ twoje pytanie dotyczy Google Chrome powinieneś wiedzieć, że Chrome używa nazwanych rur do komunikacji pomiędzy procesami.

W kodzie źródłowym C#, O którym wspomniałem powyżej, znajdują się 2 pliki: PipeServer.cs & PipeClient.cs. Te 2 pliki są cienkie opakowania o nazwie rury Windows API. Jest dobrze przetestowany, ponieważ setki tysięcy osób korzysta z naszych produktów. Więc stabilność i solidność były wymogiem.

Jak wykorzystujemy projekt wieloprocesowy

Teraz, gdy masz wszystkie elementy układanki, pozwól mi powiedzieć, jak używamy projektowania wieloprocesowego w naszej aplikacji.

Nasz produkt jest kompletne rozwiązanie updater. Oznacza to, że istnieje program , który buduje poprawki aktualizacji (Nie dotyczy dyskusji), samodzielny program updater (wyUpdate - również open source) i Automatyczna kontrola Updatera, który nasi użytkownicy umieszczają na swoich C# lub VB.NET formularze.

Używamy nazwanych rur do komunikacji między samodzielnym updater (wyUpdate) i automatyczną kontrolą Updater znajdującą się w formularzu programu. wyUpdate raportuje postęp do automatycznego aktualizatora i Automatyczny Aktualizator może powiedzieć wyUpdate, aby anulować postęp, aby rozpocząć pobieranie, rozpocząć wyodrębnianie itp.

W rzeczywistości, dokładny kod nazw rur, którego używamy, jest zawarty w artykule, o którym wspomniałem powyżej: Wieloprocesowa aplikacja C# jak Google Chrome.

Dlaczego nie powinieneś używać projektu wieloprocesowego

Jak Jon Skeet wspomniał powyżej, powinieneś mieć specyficzne zapotrzebowanie na model wieloprocesowy. W naszym przypadku chcieliśmy, aby aktualizator był całkowicie oddzielony od Twojego program. W ten sposób, gdyby updater jakoś się rozbił, Twój program pozostałby bez szwanku. Nie chcieliśmy też powielać naszego kodu w 2 miejscach.

To powiedziawszy, nawet z naszą dobrze przetestowaną owijarką o nazwie Pipes, komunikacja między procesami jest trudna. Stąpaj ostrożnie.

 14
Author: Wyatt O'Day,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-20 06:47:53
 10
Author: Alexander Kojevnikov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-13 10:20:38

Mój produkt, WindowTabs.com , coś w tym stylu. Musisz użyć Win32-sugeruję unikać używania SetParent, ponieważ kończy się dołączanie wejścia wątku. Zamiast tego narysuj karty nad oknami i użyj SetWindowPos, aby przenieść okna jako grupę. Ponadto niektóre kontrolki innych firm, takie jak Infragistic, nie działają poprawnie, jeśli tworzysz formularz na poziomie Win32.

 5
Author: Maurice Flanagan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-27 02:28:30

System.Interfejs API AddIn wprowadzony w. NET 3.5 umożliwia korzystanie z kontrolek interfejsu użytkownika w oddzielnych aplikacjach . Z pewnym skokiem obręczy, możesz sprawić, że będzie działać również w oddzielnych procesach.

Jest to obsługiwane navtively w WPF. Zobacz przykładowy dodatek MSDN zwraca interfejs użytkownika .

Używając Windows Forms, nie wygląda na to, że jest to natywnie możliwe przy użyciu systemu.AddIn APIs. Zobacz ten post z systemu.Architekt Jacek Gudenkauf.

Jednak istnieje obejście dla WinForms. Możesz to zrobić za pomocą małego hacka: Zobacz blog zespołu BCL wsparcie dla formularzy Windows w systemie.AddIn Hosts and Add-ins

 5
Author: Judah Himango,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-28 01:05:19

Tak. Możesz wywoływać nowe procesy za pomocą systemu .Diagnostyka.Proces . Używając na przykład formy komunikacji między procesami (IPC), . Net Remoting , możesz komunikować się między procesami. Następnie możesz ustawić rodzica okna / formularza nowego procesu na okno (zakładkę) pierwszego procesu, aby się tam pojawił.

 2
Author: Lars Truijens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-21 17:13:50

Bez zaglądania zbyt głęboko w stos rozszerzalności, możesz użyć systemu .Addin przestrzeń nazw do budowania aplikacji, która z natury może tworzyć addiny jako wizualne indywidualne karty i ustawić każdą kartę / addin jako proces wyjścia i jest to zachowanie po wyjęciu z pudełka.

Będzie miał taką samą funkcjonalność jak zakładki chrome.

 1
Author: Erick Sgarbi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-13 11:07:10