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 :

Remoting and Reflection : comment faire?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Piet
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 111
    Par défaut Remoting and Reflection : comment faire?
    Bonjour,

    Par la "reflection", il est possible d'envoyer le nom de la méthode et ses paramètres pour l'exécution au travers de InvokeMember(...)

    Dans une exécution sur le poste local, pas de problème, ceci fonctionne bien, mais par contre lorsque je travaille avec du remoting, je ne sais pas comment passer les arguments à InvokeMember. Soit le type est vu comme un proxy et je ne sais pas faire grand chose, soit le type est forcément mauvais (puisque l'interface n'implémente rien)

    Après avoir cherché, je suis tombé sur http://blogs.msdn.com/manishg/archiv...09/227400.aspx, mais ceci ne m'aide pas...

    Quelqu'un peut-il m'aider?

    Voici de plus amples informations sur le contexte (si ça peut aider à la compréhension) :

    IRemoteOperation.cs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    namespace RemotingInterfaces
    {
        public interface IRemoteOperation
        {
            bool Action(type1 param1, type2 param2, ...);
        }
    }
    RemoteOperations.cs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    namespace RemotingInterfaces
    {
        public class RemoteOperation : MarshalByRefObject, RemotingInterfaces.IRemoteOperation
        {
            bool Action(type1 param1, type2 param2, ...)
            {
                // Action is executed here
            }
        }
    }
    Ceci fonctionne très bien et m'exécute bien l'action sur le pc souhaité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    RemotingInterfaces.IRemoteOperation op;
    string pcName = "PC-DE-TEST";
    int port = 12345;
    op = (RemotingInterfaces.IRemoteOperation)Activator.GetObject(
        typeof(RemotingInterfaces.IRemoteOperation),
        "tcp://" + pcName + ":"+port.ToString()+"/RemoteOperation");
     
    bool b = op.Action(Param1, Param2, ...)
    Pour une économie et une réutilisation du code, je souhaite envoyer toutes les actions vers une fonction plus générale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bool GeneralAction( string action, object [] params)
    Ceci pourra me permettre de faire les mêmes opérations de vérification pour toutes les actions.

    Pour une exécution locale, je n'ai pas de problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private bool LocalExecute(string action, object[] myParams)
    {
        Type type1 = typeof(RemoteOperation);
        object obj = Activator.CreateInstance(type1);
        bool res = (bool)type1.InvokeMember(action, System.Reflection.BindingFlags.InvokeMethod, null, obj, myParams);
    }

    Par contre, pour exécuter sur le client, je n'arrive pas à prendre le type de op et donc de pouvoir passer par l'interface :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private bool RemoteExecute(string action, object[] myParams, string pcName, DateTime expirationDate)
    {
        Type myType = typeof(IRemoteOperation);
        string url = "tcp://" + pcName + ":"+port.ToString()+"/RemoteOperation";
        op = (IRemoteOperation)Activator.GetObject(myType,url);
        //Ce qui suit est faux!
        Type type2 = typeof(IRemoteOperation);
     
        bool res2 = (bool)type2.InvokeMember(action, System.Reflection.BindingFlags.InvokeMethod,null, op, myParams);
     
    }
    Comment faire?

    Toute solution est la bienvenue.

    Merci d'avance.

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    et en invokant un membre de l'interface avec de la reflection sur l'interface ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre confirmé Avatar de Piet
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 111
    Par défaut
    C'est bien ce que j'essaie de faire, mais je ne vois pas trop comment... C'est ce que la dernière frame de code montre.

    En gros, de quoi dois-je faire un "CreateInstance()" ?

  4. #4
    Membre confirmé Avatar de Piet
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 111
    Par défaut
    On peut faire un invokemember sur un membre d'interface?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Type myType = typeof(IRemoteOperation);//type1.GetInterface("RemotingInterfaces.IRemoteOperation");
     
    string url = "tcp://" + pcName + ":"+port.ToString()+"/RemoteOperation";
    IRemoteOperation theRemoteOperation = null;
    theRemoteOperation = (IRemoteOperation)Activator.GetObject(myType,url);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    object objro01 = Activator.CreateInstance(myType);
    Crée une exception :
    "impossible de créer une interface"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    object objro02 = Activator.CreateInstance(theRemoteOperation.GetType());
    crée une exception :
    "impossible de créer une méthode abstraite"

    Une idée?

    Je ne vois plus clair...

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    si c'est pour instancier des objets, on ne peut pas avec juste une interface (trouver une méthode encore ca devrait etre faisable)

    donc si tu veux créer une instance dont le type est sur le serveur, je pense qu'il faut que tu demandes l'instance au serveur qui lui aura accès aux classes
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre confirmé Avatar de Piet
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 111
    Par défaut
    ok... Et comment puis-je faire ça?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment faire du drag and drop dans un Listbox
    Par jca dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 08/02/2013, 20h54
  2. Comment faire fonctionner Remote System Explorer ?
    Par coolben dans le forum Eclipse PHP
    Réponses: 0
    Dernier message: 12/03/2010, 13h50
  3. GCC AND XLC comment faire
    Par eljuventino dans le forum Linux
    Réponses: 11
    Dernier message: 01/07/2009, 12h33
  4. Réponses: 2
    Dernier message: 28/05/2008, 11h15
  5. Comment faire pour créer un bitmap
    Par GliGli dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/04/2002, 15h41

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