Condividi tramite


Modifica di un'interfaccia esistente

Se possibile, implementare una nuova interfaccia per l'applicazione, anziché apportare modifiche a una esistente. Se non è possibile evitare di modificare un'interfaccia esistente, usare nuovi tipi di dati solo nei nuovi metodi. L'introduzione di un nuovo tipo di dati o la modifica di un tipo esistente è l'origine più comune dei problemi di incompatibilità. Il modello di runtime RPC presuppone che l'applicazione ricevente sappia i tipi di dati ricevuti, quindi i dati vengono inseriti sul filo senza una descrizione dei dati generica. Quando il destinatario prevede un tipo di dati diverso rispetto a quello che il mittente ha messo sul filo, lo stub genera un'eccezione (o la trasmissione ha esito negativo in alcuni altri modi meno grazia).

Un'interfaccia RPC è definita dal relativo UUID e dai relativi numeri di versione principale e secondaria. Quando si modifica un'interfaccia esistente, è necessario aggiungere i nuovi metodi alla fine dell'interfaccia e modificare il numero di versione secondaria. Se si aggiungono metodi altrove o si apportano altre modifiche all'interfaccia, sarà necessario modificare anche il numero di versione principale.

Realisticamente, ci sono momenti in cui non è possibile modificare anche il numero di versione secondaria, perché un nuovo client non sarà in grado di comunicare con un server precedente e non è possibile aggiornare il server. Il tempo di esecuzione RPC genera un'eccezione, RPC_S_PROCNUM_OUT_OF_RANGE, quando un client chiama un metodo oltre quelli specificati per l'interfaccia con il server. La soluzione alternativa consiste nel lasciare invariati i numeri di versione e scrivere il codice client per gestire questa eccezione in modo corretto, riducendo le prestazioni del client, ad esempio o con qualsiasi mezzo appropriato per l'applicazione.

Esiste una soluzione alternativa simile per un caso speciale di modifica di un tipo di dati in un metodo esistente. Se si dispone di un'unione i cui rami sono puntatori e che non dispone di un ramo predefinito per tipi non riconosciuti, è possibile aggiungere un nuovo ramo che usa il nuovo tipo di dati. Questa operazione non modifica le dimensioni della struttura dei dati. Quando il client parla con un nuovo server, può usare il nuovo tipo di dati. Tuttavia, quando il client parla con un server precedente, il tempo di esecuzione genererà l'eccezione RPC_S_INVALID_TAG. Di nuovo, sarà necessario scrivere il codice client per gestire questa eccezione in modo appropriato.

Un'interfaccia DCOM viene identificata dal GUID. In DCOM le interfacce sono considerate non modificabili e è possibile apportare modifiche solo creando una nuova interfaccia che eredita da quella precedente. Queste regole garantiscono che i client e i server rimangano compatibili.