Les services de Windows avec windows forms dans le même processus
J'ai une application en c# qui fonctionne comme un service windows contrôler les connexions socket et d'autres choses.
Aussi, il y a une autre application windows forms pour contrôler et configurer ce service (systray avec start, stop, afficher le formulaire avec les paramètres de configuration).
Je suis en utilisant .net remoting pour faire de la CIB et que tout allait bien, mais maintenant je veux montrer à certains de trafic réel et d'autres rapports et d'accès distant ne sera pas répondre à mes exigences de performance. Je tiens donc à combiner les deux applications en une.
Voici le problème:
Quand j'ai commencé le formulaire du service de windows, rien ne s'est passé. Googler autour de moi, je ai trouvé que je dois cliquer droit sur le service, passez à ouvrir une session et cochez la case "Autoriser le service à interagir avec le bureau" option. Depuis que je ne veux pas demander à mes utilisateurs, j'ai un peu de code googler à nouveau la valeur de cette option par l'utilisateur dans le regedit au cours de l'installation. Le problème, c'est que même la définition de cette option, il ne fonctionne pas. J'ai pour ouvrir le Journal Sur les options de service (il est coché, décochez la case vérifier de nouveau.
Alors, comment résoudre ce problème? Comment est la meilleure façon d'avoir un service windows avec un systray de contrôle dans le même processus, à la disposition de tout utilisateur connecter?
Mise à JOUR: Merci pour les commentaires jusqu'à présent, les gars. Je suis d'accord qu'il est préférable d'utiliser de la CIB et je sais que c'est mauvais pour mélanger les services windows et des interfaces utilisateur. Même si, je veux savoir comment le faire.
- "Je sais que le couplage de l'INTERFACE utilisateur avec mon service de briser mon logiciel, et peut-être mon ordinateur des utilisateurs, mais je veux le faire de toute façon." Prendre 3 ou 4 pas en arrière et re-évaluer si vous devez faire ce que vous essayez de faire. Est-il encore un sens?
- D: je ne sais pas d'où vous est venue cette guillemets, mais je n'ai jamais dit à un service avec INTERFACE utilisateur de casser l'ordinateur de l'utilisateur. En fait tout logiciel pourrait faire beaucoup de dégâts avec l'ordinateur de l'utilisateur, de sorte que vous n'avez pas de point du tout. De toute façon, je n'ai jamais demandé si je devais le faire ou pas, j'ai demandé COMMENT le faire.
Vous devez vous connecter pour publier un commentaire.
Deux processus distincts qui communiquent à l'aide de votre technologie de choix. Services avec l'INTERFACE utilisateur est un mauvaise idée. Ne pas aller en bas de cette route - vous le regretterez.
J'ai eu de très bons résultats ayant le service de la communication par le biais d'une simple connexion de socket - document de votre service de protocole, de le garder aussi simple que possible, et il sera plus facile que vous le pensez.
Dans la pratique, vous ne devriez pas couple votre service grâce à l'INTERFACE de gestion.
Je suis d'accord avec Greg. Vous pourriez peut-être examiner un autre mécanisme IPC. Peut-être utiliser des sockets et de votre propre protocole. Ou, si votre service de contrôle de l'application ne peut contrôler le service sur la machine locale, vous pouvez utiliser des canaux nommés (encore plus rapide).
Ici est une façon de mélanger les Services et les Formes
http://www.codeproject.com/KB/system/SystemTrayIconInSvc.aspx
J'ai compris comment le faire à partir de cet article (cliquez sur le lien "Modifier" dans les Méthodes de table).
OnStart()
il ne fonctionne pas comme ça.parameters[6] = "LocalSystem"; parameters[7] = "";
donc l'ouverture de session en tant que compte système local est sélectionné. 😉J'ai la solution en quelques étapes, c'est le plan
nous n'allons pas créer un projet de service avec un formulaire windows, au lieu de cela, nous allons créer une solution visual studio qui contient un projet de service windows, un windows form de projet et un projet d'installation.
L'idée est d'avoir une base de données ou un fichier, ou tout ce que vous êtes à l'aise avec le stockage de données dans laquelle vous serait de stocker les paramètres de votre windows sera toujours utiliser pour exécuter. Si votre service windows et de votre application windows form devrait être en mesure de modifier et récupérer des données à partir d'elle.
À la Forme Principale De Votre Application Windows glisser et de déposer un NotifyIcon sur la forme, dans l'onglet propriétés, parcourir, et sélectionner un .ico en image(Vous pouvez sreate un dans visual studio, mais c'est un autre sujet que vous pouvez obtenir sur google ou contactez-moi) Qu'il s'affiche dans la barre d'état système lorsque vous exécutez l'application et de la forme principale est active ou indiqués, essayez-le, lancez l'application.
Ajouter toutes les deux comme des sorties dans le projet d'installation de la solution. Pour Ajouter un projet à un projet d'installation, ils doivent être dans la même solution. Cliquez-droit sur le projet d'installation dans l'explorateur de solutions, sélectionnez ajouter, puis sélectionnez le projet de sortie, ajouter le service windows et windows form sorties et vous allez les voir dans l'explorateur de solutions, dans le projet d'installation.
l'ajout d'un service windows va plus loin que cela, mais c'est aussi un autre sujet de google il
La création de raccourci pour l'application de windows et les ajouter dans le dossier de démarrage est aussi un autre sujet de google ou de me contacter.
Programme de billets à votre forme de telle manière que le bouton de fermeture ne montre pas et qui va Me.visible = false et en double cliquant sur l'icône dans la barre d'état système est le seul moyen de me.visible=true.de cette façon, chaque fois que l'ordinateur démarre, votre application windows form est également débuté et visible est immédiatement mis à false mais depuis, il a un notifyicon avec une icône de l'image, elle s'affichera dans la barre d'état système et en double cliquant sur il fait de la forme visible pour modifier les paramètres de stockage pour le service, le service démarre automatiquement puisque vous l'avez défini dans la configuration du service dans le projet d'installation.
mon mail est [email protected] pour une meilleure illustration à l'aide de captures d'écran Et des explications
C'est très simple, votre besoin de créer un thread pour effectuer des événements d'application.
Comme ceci( code source C++ avec CLR, mais vous pouvez faire cela en C#):
Et de créer de thread principal
Les principaux problèmes avec les services interactifs sont:
De sécurité - autres processus peut envoyer des messages au travers de son message de la pompe, ce qui permet l'accès à un SYSTÈME/processus LOCAL.
Incomplétude - un service interactif ne voit jamais shell messages, donc il ne peut pas interagir avec la Zone de Notification les icônes.
Nous utilisons régulièrement les connexions TCP et UDP pour transmettre des informations à partir de services à d'autres exe, et, dans certains cas, MSMQ.