Partager via


Problèmes de version pour les types valeur imbriqués dans les types natifs (C++/CLI)

Considérez un composant d'assembly signé (nom fort) utilisé pour générer un assembly client. Le composant contient un type valeur utilisé dans le client en tant que type d'un membre d'une union native, une classe ou un tableau. Si une version future du composant modifie la taille ou la présentation du type valeur, le client devra être recompilé.

Créez un keyfile avec sn.exe (sn -k mykey.snk).

Exemple

L'exemple suivant est le composant.

// nested_value_types.cpp
// compile with: /clr /LD
using namespace System::Reflection;
[assembly:AssemblyVersion("1.0.0.*"), 
assembly:AssemblyKeyFile("mykey.snk")];

public value struct S {
   int i;
   void Test() {
      System::Console::WriteLine("S.i = {0}", i);
   }
};

Voici l'exemple client :

// nested_value_types_2.cpp
// compile with: /clr
#using <nested_value_types.dll>

struct S2 {
   S MyS1, MyS2;
};

int main() {
   S2 MyS2a, MyS2b;
   MyS2a.MyS1.i = 5;
   MyS2a.MyS2.i = 6;
   MyS2b.MyS1.i = 10;
   MyS2b.MyS2.i = 11;

   MyS2a.MyS1.Test();
   MyS2a.MyS2.Test();
   MyS2b.MyS1.Test();
   MyS2b.MyS2.Test();
}

Sortie

S.i = 5
S.i = 6
S.i = 10
S.i = 11

Commentaires

Toutefois, si vous ajoutez un autre membre à struct S dans nested_value_types.cpp, (par exemple, double d;) et si vous recompilez le composant sans recompiler le client, le résultat est une exception non gérée (de type FileLoadException).

Voir aussi

Autres ressources

Types managés (C++/CLI)