2009-06-09 7 views
0

J'étudie .net RemotingConfusion dans .net Remoting

J'ai lu de MSDN, mais en une seule étape, je fais face à une certaine confusion ..

Trois étapes sont nécessaires pour l'accès distant fin.

une - RemoteObject

2 - Host

3 - Client

créant RemoteObject et hôte est très bien. Je comprends toutes les choses, il utilise le fichier de configuration pour la configuration de l'hôte et du client. Dans le client utilise le code suivant

public static void Main(){ 
     RemotingConfiguration.Configure("Client.exe.config"); 
     RemotableType remoteObject = new RemotableType(); 
     Console.WriteLine(remoteObject.SayHello()); 
    } 

Ici, il crée l'objet de RemotableType avec nouvel opérateur. Où comme cette application client a référence de RemotableType.dll.

Lorsque ce dll est disponible localement alors à quoi sert d'appeler SayHello() à distance?

J'ai exécuté ce client sans exécuter le serveur et il m'indique toujours le message Hello World.

Cette création de remoteObject avec un nouvel opérateur est-elle valide ici?

Où que l'autre méthode pour obtenir RemoteObject est:

RObject remoteObject = (RObject)Activator.GetObject(typeof(RObject), "tcp://localhost:9999/RObject"); 
+0

Je ne suis pas un espacement distant ... mais vous devriez noter que l'accès à distance est largement remplacé par WCF maintenant; voir le texte en gras en haut de cette page MSDN: http://msdn.microsoft.com/en-us/library/kwdt6w2k(VS.85).aspx –

+0

Cette rubrique est spécifique à une technologie héritée conservée pour compatibilité descendante avec les applications existantes et n'est pas recommandé pour les nouveaux développements. Les applications distribuées doivent maintenant être développées en utilisant Windows Communication Foundation (WCF).

+0

Et si j'avais l'intention de travailler?Net 2.0 WCF est pour .Net 3.0 + – Mohsan

Répondre

0

Habituellement, vous allez créer deux DLL: une qui contient des définitions d'interface pour votre objet distant et une autre qui contient l'implémentation des définitions d'interface.

Vous allez ensuite ajouter la DLL de définition d'interface au client, alors que le serveur a besoin des deux DLL. Le client créera ensuite des instances de la classe en utilisant l'appel Activator.GetObject(...).

Si vous faites référence à la DLL d'implémentation de votre client - comme vous l'avez souligné - vous n'avez aucun avantage de l'implémentation client/serveur.

+0

J'ai résolu ce problème en créant interfacec. et en faisant ce client ont seulement référence à cette interface pas l'implémentation complète. ce qui est plus sûr. – Mohsan

0

appel nouvelle RemotableType() crée simplement une instance locale de RemotableType sur le client. L'appel de n'importe quelle méthode sera appelé sur cette instance.

L'utilisation d'Activator.GetObject() crée un TransparentProxy dans le client à l'instance de RemotableType qui a été publiée dans l'application hôte. Appeler n'importe quelle méthode sur ceci fera un appel à distance à l'application d'hôte et s'exécutera là. Si votre implémentation de SayHello devait retourner le nom de l'assembly d'entrée (en utilisant Assembly.GetEntryAssembly()), il retournerait Host.exe même si vous êtes en cours d'exécution dans le client.