IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Comment appeler une méthode d'un executable en IPC sans connaitre son implémentation?


Sujet :

C#

  1. #1
    Membre habitué
    Avatar de barthelv
    Inscrit en
    Mars 2003
    Messages
    267
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 267
    Points : 126
    Points
    126
    Par défaut Comment appeler une méthode d'un executable en IPC sans connaitre son implémentation?
    Bonjour,

    C'est la première fois que j'utilise le service System.Runtime.Remoting.Channels.Ipc. J'ai deux executables, et je veux que l'executable A appelle une méthode de l'éxécutable B. Du coup j'ai codé un client IPC côté A et un server IPC côté B.

    Côté server le bout de code qui "expose" l'objet ressemble à cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                // Expose an object for remote calls.
                System.Runtime.Remoting.RemotingConfiguration.
                    RegisterWellKnownServiceType(
                        typeof(RemoteObject), "RemoteObject.rem", 
                        System.Runtime.Remoting.WellKnownObjectMode.Singleton);
    Et le remote object est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            // Remote object.
            public class RemoteObject : MarshalByRefObject
            {
                public void NewFile(int Id)
                {
                    Console.WriteLine("NewFile has been called for Id {0}", Id);
                }
            }
    Côté client, le bout de code qui "s'enregistre pour l'objet distant" est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                // Register as client for remote object.
                System.Runtime.Remoting.WellKnownClientTypeEntry remoteType =
                    new System.Runtime.Remoting.WellKnownClientTypeEntry(
                        typeof(RemoteObject),
                        "ipc://localhost:9090/RemoteObject.rem");
                System.Runtime.Remoting.RemotingConfiguration.
                    RegisterWellKnownClientType(remoteType);
    Jusque là c'est très classique, cela vient de MSDN...

    Le soucis c'est que je ne comprends pas pourquoi il faut que le client connaisse l'implémentation de l'objet qu'elle appelle. Donc je ne veux pas copier-coller dans mon client le même code que ce qui est côté server. Or si je ne mets pas aussi le code côté client, cela ne compile pas à cause de l'appel à WellKnownClientTypeEntry(typeof(RemoteObject),"ipc://localhost:9090/RemoteObject.rem");

    J'ai l'impression que je devrais remplacer "WellKnownClientTypeEntry" par autre chose, mais je ne vois pas trop quoi...

    J'espère être assez clair.

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    Pourquoi ne pas passer par des sockets ?

    Le client d'un processus A envoi une trame vers un processus B (sur la même machine ou non d’ailleurs). Tu passes dedans ton paramètre Id. Ton processus B décode la trame et exécute la fonction qui va bien. Tu peux même pousser pour avoir le retour de l'exécution de la fonction dans une réponse à la 1ere trame
    Genre STX;ORDRE;PARAM1;PARAM2;PARAM3;PARAM4;ETX

    Enfin ça me semble plus propre que de dupliquer du code... Enfin je ne sais pas. J'ai jamais utilisé System.Runtime.Remoting.Channels.Ipc

  3. #3
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    bonjour

    à la question : pourquoi il faut que le client connaisse l'implémentation de l'objet qu'elle appelle
    De mémoire, pour le remoting, le framework utilise des mécanismes de sérialization pour transférer les données.

    Qui dit serialization, dit forcément connaitre ce qu'on sérialise et ceci explique le besoin de connaitre, non pas l'implémentation finalement,
    mais les données qui vont être sérialisée.

    Il me semble qu'avec l'utilisation d'interface, on peut ne connaitre que le prototype et donc, pas nécessairement avec un lien sur la dll qui implémente
    l'interface... D'ailleurs, quand on fait du remoting, souvent, on a :

    1 - assembly contenant uniquement des interfaces
    2 - Assembly serveur qui implémente les interfaces
    3 - Assembly client qui, en s'appuyant sur les interfaces, appelles un serveur qui les implémentent

Discussions similaires

  1. Réponses: 6
    Dernier message: 25/04/2007, 18h07
  2. Comment appeler une méthode dont le nom est dans un string?
    Par Ireon dans le forum API standards et tierces
    Réponses: 22
    Dernier message: 13/04/2007, 17h22
  3. Réponses: 2
    Dernier message: 31/08/2005, 16h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo