Condividi tramite


Esempi di modifiche incompatibili

Quando si tratta di modifiche incompatibili, la regola sfortunata di pollice è la seguente: qualsiasi modifica può essere incompatibile con le versioni precedenti, a meno che non sia molto ben comprensibile. Questa regola richiede la conoscenza delle regole NDR. Se non si sa qual è il rapporto di mancato recapito, non apportare modifiche. Di seguito sono riportati alcuni esempi di modifiche che in genere causano una violazione di accesso nell'applicazione o un BAD_STUB_DATA_EXCEPTION generato dal motore di marshalling:

  • Aggiunta di un nuovo metodo al centro dei metodi precedenti.
  • Aggiunta o rimozione di parametri da un metodo.
  • Modifica di un attributo, ad esempio un attributo puntatore: modifica di [ref] in [unique] o [ptr] o viceversa. Ogni tipo di puntatore ha una rappresentazione di filo diversa.
  • Modifica delle dimensioni dei dati: da short a long, da char a wchar_t (unicode), aggiungendo un campo a una struttura, modificando le dimensioni di una matrice di dimensioni fisse.
  • Aggiunta di armi di unione a un'unione con una clausola predefinita.

Alcune modifiche insidie o mancate corrispondenze impreviste tra un client e un server possono verificarsi come segue:

  • Modifica di un membro di un tipo composto, ad esempio una struttura o una matrice. Ad esempio, se un CLIENT_ID passa da un integrale a un GUID, una struttura CLIENT_RECORD con il campo CLIENT_ID diventa incompatibile. Questo può essere difficile da rilevare se è stato eseguito il cascading tra diversi livelli di incorporamento in un tipo di parametro remoto effettivo.
  • Modifica di un tipo importato. Il tipo può provenire da un componente diverso che non è direttamente remoto, quindi la modifica è stata considerata compatibile.
  • L'uso di #ifdef in un file IDL non è un'idea valida per le definizioni dei tipi ifdef in un file IDL. È in attesa di un'emergenza. Inevitabilmente, a causa della compilazione o di altri errori, un client viene compilato con un set diverso di definisce rispetto al server e finisce per essere incompatibile.