Compartir a través de


Cambiar una interfaz existente

Siempre que sea posible, implemente una nueva interfaz para la aplicación, en lugar de realizar cambios en una existente. Si no puede evitar cambiar una interfaz existente, use nuevos tipos de datos solo en nuevos métodos. La introducción de un nuevo tipo de datos o la modificación de un tipo existente es el origen más común de problemas de incompatibilidad. El modelo en tiempo de ejecución rpc supone que la aplicación receptora conoce los tipos de datos que recibe, por lo que los datos se colocan en la conexión sin una descripción de datos genérica. Cuando el destinatario espera un tipo de datos diferente al que el remitente ha puesto en la conexión, el código auxiliar genera una excepción (o se produce un error en la transmisión de alguna otra manera menos correcta).

Una interfaz RPC se define mediante su UUID y sus números de versión principal y secundaria. Al cambiar una interfaz existente, debe agregar los nuevos métodos al final de la interfaz y cambiar el número de versión secundaria. Si agrega métodos en cualquier otro lugar o realiza cualquier otro cambio en la interfaz, también tendrá que cambiar el número de versión principal.

De forma realista, hay ocasiones en las que no se puede cambiar incluso el número de versión secundaria, ya que un nuevo cliente no podrá comunicarse con un servidor antiguo y no se puede actualizar el servidor. El tiempo de ejecución de RPC genera una excepción, RPC_S_PROCNUM_OUT_OF_RANGE, cuando un cliente llama a un método más allá de los especificados para su interfaz con el servidor. La solución consiste en dejar los números de versión sin cambios y escribir el código de cliente para controlar esta excepción correctamente, por parte del cliente degradando su rendimiento, por ejemplo, o por cualquier medio adecuado para la aplicación.

Hay una solución similar para un caso especial de cambio de un tipo de datos en un método existente. Si tiene una unión cuyas ramas son punteros y que no tiene una rama predeterminada para los tipos no reconocidos, puede agregar una nueva rama que use el nuevo tipo de datos. Esto no cambiará el tamaño de la estructura de datos. Cuando el cliente se comunica con un nuevo servidor, puede usar el nuevo tipo de datos. Sin embargo, cuando el cliente se comunica con un servidor antiguo, el tiempo de ejecución generará la excepción RPC_S_INVALID_TAG. De nuevo, deberá escribir el código de cliente para controlar esta excepción correctamente.

Una interfaz DCOM se identifica mediante su GUID. En DCOM, las interfaces se consideran inmutables y solo se pueden realizar cambios mediante la creación de una nueva interfaz que herede de la antigua. Estas reglas garantizan que los clientes y servidores sigan siendo compatibles.