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:
1 2 3 4 5 6 7 8
|
namespace RemotingInterfaces
{
public interface IRemoteOperation
{
bool Action(type1 param1, type2 param2, ...);
}
} |
RemoteOperations.cs
Code:
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:
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:
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:
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:
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.