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
RemoteOperations.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, ...); } }
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
10
11 namespace RemotingInterfaces { public class RemoteOperation : MarshalByRefObject, RemotingInterfaces.IRemoteOperation { bool Action(type1 param1, type2 param2, ...) { // Action is executed here } } }
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
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, ...)
Ceci pourra me permettre de faire les mêmes opérations de vérification pour toutes les actions.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 bool GeneralAction( string action, object [] params)
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 :
Comment faire?
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); }
Toute solution est la bienvenue.
Merci d'avance.
Partager