Application Windows Forms, comme Google Chrome, avec plusieurs processus
Est-il possible d'utiliser C# pour créer une application conteneur où chaque onglet est en fait son propre processus comme avec Google chrome?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le SetParent Win32 appel pour ce faire, mais c'est vraiment pleine de problèmes. J'ai eu assez d'ennuis tout fonctionner bien à l'aide de windows à partir de différents domaines d'application - il y aurait encore plus de difficultés avec l'ensemble du processus supplémentaire.
Fondamentalement, il y a potentiellement beaucoup de communication entre les deux processus - des choses comme le redimensionnement peut devenir très douloureux, ainsi que ce qui se passe si l'enfant app veut arrêter de fumer etc. Il est tout à fait faisable, mais je préfère réfléchir très attentivement avant de le faire. Pour un navigateur, il fait beaucoup de sens (disclaimer: je travaille pour Google), mais pour la plupart des autres apps il ne vaut vraiment pas la peine.
(Les "onglets" vous voulez créer réelle .NET applications? Si donc, comme je le dis cela devient nettement plus facile - et je peux vous donner une indication importante qui est que chaque INTERFACE doit exécuter son propre thread de l'INTERFACE utilisateur à partir de l'intérieur de son propre domaine d'application. Vous obtenez vraiment bizarre effets si vous ne le faites pas!)
Pour ceux d'entre vous intéressés par la mise en œuvre effective de processus multiples applications, j'ai écrit un article à ce sujet sur mon site: Multi-processus d'application en C#, comme Google Chrome.
J'ai inclus le travail de code C#. Il a été testé pour fonctionner avec .NET 2.0, .NET 3.0, et .NET 3.5.
Canaux nommés: Comment les processus de parler à tour de rôle
Depuis votre question spécifiquement demandé à propos de Google Chrome, vous devez savoir que Chrome utilise des canaux nommés pour la communication entre processus.
Dans le code source C# je l'ai mentionné ci-dessus il y a 2 fichiers: PipeServer.cs & PipeClient.cs. Ces 2 fichiers sont des wrappers minces des canaux Nommés API de Windows. C'est bien testé parce que des centaines de milliers de personnes utilisent nos produits. Alors la stabilité & robustesse ont une exigence.
La façon dont nous utilisons le multi-processus de conception
Maintenant que vous avez toutes les pièces du puzzle, permettez-moi de vous dire comment nous les utilisons Multi-processus de conception de notre application.
Notre produit est un programme de mise à jour de la solution. C'est, il y a un programme qui construit des correctifs de mise à jour (pas pertinents à la discussion), autonome programme de mise à jour (wyUpdate - également open source), et un Mise à jour automatique de contrôle de la que nos utilisateurs de mettre leurs C# ou VB.NET les formulaires.
Nous utilisons des canaux nommés pour communiquer entre le programme de mise à jour autonome (wyUpdate) et la mise à jour Automatique de contrôle assis sur votre formulaire du programme. wyUpdate rapports de progrès pour la mise à jour Automatique, et la mise à jour Automatique peut dire wyUpdate d'annuler les progrès, pour commencer le téléchargement, lancez l'extraction, etc.
En fait, l'exacte des canaux nommés code que nous utilisons est inclus dans l'article que j'ai mentionné ci-dessus: Multi-processus d'application en C#, comme Google Chrome.
Pourquoi vous ne devriez pas utiliser le multi-processus de conception
Comme Jon Skeet mentionné ci-dessus, vous avez un besoin spécifique pour le multi-modèle de processus. Dans notre cas, nous voulions garder la mise à jour complètement séparé de votre programme. De cette façon, si le programme de mise à jour en quelque sorte écrasé, votre programme devrait rester indemne. Nous ne voulons pas reproduire notre code à 2 endroits.
Cela étant dit, même avec notre bien-testé canaux Nommés wrapper, communication inter-processus est difficile. Donc la bande de roulement avec soin.
Vérifier ce post sur le Chrome Blog. Un seul processus est responsable pour le rendu à l'écran.
Mon produit, WindowTabs.com, fait de cette. Vous avez besoin d'utiliser Win32 - je vous suggère d'éviter d'utiliser SetParent parce que vous finissez par attacher le fil d'entrée. Au lieu de cela, tirer les onglets au-dessus des fenêtres et l'utilisation SetWindowPos pour déplacer les fenêtres en tant que groupe. Aussi, certains contrôles tiers comme Infragistic ne pas fonctionner correctement si vous parent de la forme à un Win32 niveau.
Le Système.AddIn Api introduit dans .NET 3.5 vous permet d'utiliser des commandes de l'INTERFACE utilisateur en séparer domaines d'application. Avec quelques hoop de sauter, vous pouvez le faire fonctionner dans des processus distincts, trop.
C'est pris en charge navtively en WPF. Consultez le site web MSDN échantillon Ajouter Renvoie une INTERFACE utilisateur.
À l'aide de Windows Forms, il ne regarde pas comme il est nativement possible d'utiliser le Système.AddIn Api. Voir ce post à partir d'un Système.AddIn architecte Jack Gudenkauf.
Cependant, il existe une solution de contournement pour WinForms. Vous pouvez faire ce travail avec un peu de bidouille: Voir la BCL blog de l'équipe Le Support pour Windows Forms dans le Système.AddIn les Hôtes et les compléments
Oui. Vous pouvez frayer de nouveaux processus à l'aide de Système.Diagnostics.Processus. En utilisant une certaine forme de communication inter-processus (IPC), .NET Remoting par exemple, vous pouvez établir la communication entre les processus. Et puis vous pouvez définir le parent de la fenêtre/forme de votre nouveau procédé à une fenêtre (onglet) de votre premier processus de sorte qu'il apparaît.
Sans regarder trop profondément dans l'extensibilité de la pile, vous pouvez utiliser le Système.Addin espace de noms pour construire une application qui, naturellement, peuvent créer des compléments visuels différents onglets et réglez chaque onglet/addin comme un processus et c'est un comportement hors de la boîte.
Il aura les mêmes fonctionnalités que le chrome onglets.