Herramientas de usuario

Herramientas del sitio


highlevel:csharp:xtra2

¡Esta es una revisión vieja del documento!


C# Xtra (II)

Comunicación entre procesos

Canales IPC

Son utilizados para realizar una comunicación entre procesos que están corriendo en la misma máquina (IPC, inter-process communication). Y son más rápidos que utilizar rutinas sobre red, son algo parecidas a las Named Pipes existentes en el kernel32.dll.
Para poder usar dichos canales se necesitan los siguientes elementos:

  1. Objeto cliente.
  2. Objeto servidor.
  3. Objetos compartidos, referenciados tanto por el cliente como por el server pero que a la vez no referencien a ninguno de ellos.

También necesitaremos agregar una referencia a System.Runtime.Remoting. Y hacer using de unos cuantos namespaces:

using System.Runtime.Remoting.Channels.Ipc;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting;

El dominio de la aplicación

Un dominio de aplicación es un proceso dentro del sistema operativo donde una o más aplicaciones residen. Los objetos que se encuentran en el mismo dominio de aplicación se comunican directamente, en cambio, los que están en distintos dominios se comunican a partir del transporte de copias de estos objetos. Existe una clase (System.MarshalByRefObject) que sirve como clase base para las clases que intervengan la comunicación e intercambio de mensajes entre dominios de aplicación (si no heredasen serían marshal by value).

Los objetos compartidos

Necesitaremos crear la clase de los objetos que se compartirán (ha de heredar de MarshalByRefObject).

namespace SharedObjects {
    public class Class1 : MarshalByRefObject {
        string v;
        public string Value {
            get {
                return this.v;
            }
            set {
                this.v = value;
            }
        }
    }
}

El servidor

Creamos un canal de servidor a partir de un nombre de canal (en formato string) y lo registramos mediante el método estático de la clase ChannelServices, a este se le pasan dos objetos, un objeto correspondiente al canal en sí y un boolean, que será true si el canal será manejado a partir de un protocolo seguro.

Luego deberemos registrar los objetos compartidos a partir del método estático RegisterWellKnownServiceType dentro de RemotingConfiguration, si lo hacemos mediante WellKnownObjectMode.Singleton se creará un único objeto objeto, para acceder a él la ruta será ipc://nombreDelCanal/NombreDelObjeto.

Para recoger un objeto utilizaremos el método GetObject de la clase Activator.

IpcServerChannel server = new IpcServerChannel("myChannel");
ChannelServices.RegisterChannel(server, false);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(SharedObjects.Class1), "sharedObjs", WellKnownObjectMode.Singleton);
SharedObjects.Class1 c = (SharedObjects.Class1)Activator.GetObject(typeof(SharedObjects.Class1), "ipc://myChannel/sharedObjs");
c.Value = "Servidor";

El cliente

IpcClientChannel icc = new IpcClientChannel();
ChannelServices.RegisterChannel(icc, true);
RemotingConfiguration.RegisterWellKnownClientType(typeof(SharedObjects.Class1), "ipc://myChannel/sharedObjs");
SharedObjects.Class1 c = (SharedObjects.Class1)Activator.GetObject(typeof(SharedObjects.Class1), "ipc://myChannel/sharedObjs");
Console.WriteLine(c.Value);

Configuración

Fichero app.config

El fichero que configura la aplicación es el app.config y se ha de encontrar en el directorio donde está el ensamblado ejecutable de la aplicación.

Leer un valor

Para leer el valor logFile de un fichero de configuración como el que sigue:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="logFile" value="log.txt"/>
  </appSettings>
</configuration>

Utilizaremos un objeto de la clase AppSettingsReader y su método GetValue:

new System.Configuration.AppSettingsReader().GetValue("logFile", typeof(String))

Agregar secciones

Podemos agregar secciones personalizadas al fichero, por ejemplo una sola para el tema de log, para ello deberemos declararla entro de la tag configSections indicando nombre y tipo como sigue:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section  name="log" type="System.Configuration.DictionarySectionHandler" />
  </configSections>
  <appSettings>
  </appSettings>
  <log>
    <add key="logFile" value="log.txt"/>
  </log>
</configuration>

Para leer estas secciones

highlevel/csharp/xtra2.1234277644.txt.gz · Última modificación: 2020/05/09 09:24 (editor externo)