Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionusing System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Ipc; using System.Linq; public class Client { public static void Main() { // Récupération des arguments de la ligne de commande après suppression du chemin de l'exécutable string[] Args = Environment.GetCommandLineArgs(); Args = Args.Skip(1).ToArray(); string FileList = string.Join("|", Args); // Création et enregistrement du canal IPC IpcClientChannel clientChannel = new IpcClientChannel(); ChannelServices.RegisterChannel(clientChannel, true); // Enregistrement de l'objet d'échange RemotingConfiguration.RegisterWellKnownClientType(typeof(LoadFile), "ipc://SudokuHelper/LoadFile"); // Création d'un objet de la classe LoadFile => connexion au serveur LoadFile LoadFile = new LoadFile(); LoadFile.Files2Load = FileList; // Envoi du message au serveur Console.WriteLine(LoadFile.Files2Load); // Le retour du serveur Console.ReadLine(); // Pour pouvoir voir le retour du serveur // L'appli se ferme ici. } }
using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Ipc; public class IpcServer { public static void Main() { // Création et enregistrement de canal IPC IpcServerChannel serverChannel = new IpcServerChannel("SudokuHelper"); ChannelServices.RegisterChannel(serverChannel, true); // Enregistrement de l'objet d'échange RemotingConfiguration.RegisterWellKnownServiceType(typeof(LoadFile), "LoadFile", WellKnownObjectMode.Singleton); // Attente des appels Console.WriteLine("Ecoute du canal {0}", serverChannel.GetChannelUri()); Console.ReadLine(); } }
public class LoadFile : MarshalByRefObject { public string Files2Load { set { Console.WriteLine(value.Replace("|", "\n")); } get { return "Bien reçu"; } } }
// Double clic sur un ou plusieurs fichiers, drag-drop ou 'ouvrir' dans l'explorateur => noms des fichiers dans la ligne de commande (tableau, avec [0] = chemin de l'exécutable) string[] CmdArgs = Environment.GetCommandLineArgs(); Process aProcess = Process.GetCurrentProcess(); string aProcName = aProcess.ProcessName; Process[] Processes = Process.GetProcessesByName(aProcName); if (Processes.Length > 1) // Instance secondaire : installation du IpcClient { this.Visible = false; // Récupération des arguments de la ligne de commande après suppression du chemin de l'exécutable string[] Args = CmdArgs.Skip(1).ToArray(); string FileList = string.Join("|", Args); // Création et enregistrement du canal IPC IpcClientChannel clientChannel = new IpcClientChannel(); ChannelServices.RegisterChannel(clientChannel, true); // Enregistrement de l'objet d'échange RemotingConfiguration.RegisterWellKnownClientType(typeof(LoadFile), "ipc://SudokuHelper/LoadFile"); // Création d'un objet de la classe LoadFile => connexion au serveur // Si le serveur est fermé pendant la communication, on a une exception qu'on ne traite pas // En effet, cela ne peut guère se produire que si on met un point d'arrêt dans l'objet de comm du serveur try { LoadFile LoadFile = new LoadFile(); LoadFile.Files2Load = FileList; // Envoi du message au serveur Console.WriteLine(LoadFile.Files2Load); // Le retour du serveur } finally { Application.ExitThread(); } } else // Instance principale : installation d'un IpcServer { // Création et enregistrement de canal IPC IpcServerChannel ServerChannel = new IpcServerChannel("SudokuHelper"); ChannelServices.RegisterChannel(ServerChannel, true); // Enregistrement de l'objet d'échange RemotingConfiguration.RegisterWellKnownServiceType(typeof(LoadFile), "LoadFile", WellKnownObjectMode.Singleton); // Attente des appels Console.WriteLine("Listening on {0}", ServerChannel.GetChannelUri()); }
public class LoadFile : MarshalByRefObject { private wMain MainForm = null; private int FileCount = 0; // A la création de l'objet, on recherche la feuille MDI maître public LoadFile() { foreach (Form Frm in Application.OpenForms) if (Frm.IsMdiContainer) MainForm = Frm as wMain; } public string Files2Load { // Le set envoie une liste de fichiers séparéa par le caractère '|' set { if (MainForm == null) // Normalement pas possible, mais... FileCount = -1; else { // L'objet de comm est appelé par un autre thread (autre instance) => invoke pour accéder à la variable value MainForm.Invoke(new MethodInvoker(delegate { string[] FileList = value.Split('|'); FileCount = FileList.Length; foreach (string FilePath in FileList) MainForm.OnMruFile(0, FilePath); // Chargement du fichier (menu public) if (MainForm.WindowState == FormWindowState.Minimized) MainForm.WindowState = FormWindowState.Normal; // Restauration de la fenêtre //MainForm.BringToFront(); // Passage au premier plan - Ne marhe pas MainForm.TopMost = true; // Passage au premier plan - Fonctionne MainForm.TopMost = false; // Pour ne pas rester toujours au-dessus })); } } // Le get est supposé être appelé juste après le set pour gérer éventuellement le nombre de fichiers get { if (MainForm == null) return "Feuille MDI inconnue"; else { // On retourne le nombre de fichiers envoyés string Reponse = FileCount.ToString(); FileCount = 0; // Remise à zéro du compteur return Reponse; } } } }