Migration du code managé 32 bits à 64 bits
Remarque Si vous voulez vérifier lors de l'exécution si vous exécutez dans un environnement 64 bits, vous pouvez utiliser le IntPtr.Size comme un moyen de prendre cette décision.
Considérations sur la migration
Lors de la migration des applications gérées qui utilisent p / Invoke, tenez compte des éléments suivants:
- Disponibilité d'une version 64 bits de la DLL
- Utilisation des types de données
Disponibilité
L'une des premières choses qui doit déterminer si le code est non géré que votre demande a une dépendance est disponible pour 64 bits.
Si ce code est d'un tiers, vous devez vérifier si ce tiers a déjà le code disponible pour 64 bits et que le tiers serait prêt à le rendre disponible.
La question de risque plus élevé surviendra si le tiers ne prend en charge ce code ou si le tiers est pas prêt à faire le travail. Ces cas nécessitent des recherches supplémentaires dans les bibliothèques disponibles qui font des fonctionnalités similaires, que ce soit le tiers laisser le client faire eux-mêmes le port, etc.
Types de données
Cette modification fonctionnera dans les environnements 32 bits et 64 bits. Rappelez-vous, IntPtr est spécifique à la plateforme.
Utilisation du p / invoquer dans votre application gérée ne signifie pas que la migration vers la plate-forme 64 bits ne sera pas possible. Cela ne signifie pas qu'il y aura des problèmes. Ce que cela signifie est que vous devez examiner les dépendances sur le code non géré que votre application gérée a, et de déterminer s'il y aura des problèmes.
Migration et interopérabilité COM
l'interopérabilité COM est une capacité supposée de la plate-forme .NET. Comme la discussion précédente sur Invoke la plate-forme, ce qui rend l'utilisation de l'interopérabilité COM signifie que le code managé effectue des appels à code non géré. Cependant, contrairement à Invoke la plate-forme, l'interopérabilité COM signifie également avoir la possibilité pour le code non managé pour appeler le code managé comme si elle était un composant COM.
Encore une fois, en utilisant le code COM non géré ne signifie pas que la migration vers 64 bits aura des problèmes; il devrait plutôt être considéré comme un indicateur que l'enquête supplémentaire est nécessaire.
Considérations sur la migration
Ce qui suit est une discussion sur les différentes considérations qui doivent être accordée à l'utilisation de l'interopérabilité COM où le code managé fait COM appelle dans un environnement 64 bits. Plus précisément,
- Disponibilité d'une version 64 bits de la DLL
- Utilisation des types de données
- Les bibliothèques de types
Disponibilité
La discussion dans la p / section Invoke en ce qui concerne la disponibilité d'une version 64 bits du code dépendant est pertinent pour cette section.
Types de données
La discussion dans la p / section Invoke en ce qui concerne les types de données d'une version 64 bits du code dépendant est pertinent pour cette section.
Les bibliothèques de types
En utilisant l'interopérabilité COM dans votre application gérée ne signifie pas que la migration vers la plate-forme 64 bits ne sera pas possible. Cela ne signifie pas qu'il y aura des problèmes. Ce que cela signifie est que vous devez examiner les dépendances de votre application gérée a et déterminer s'il y aura des problèmes.
Migration et code unsafe
Le noyau du langage C # diffère notamment de C et C ++ dans son omission de pointeurs en tant que type de données. Au lieu de cela, C # fournit des références et la possibilité de créer des objets qui sont gérés par un éboueur. Dans le noyau du langage C #, il est tout simplement pas possible d'avoir une variable non initialisée, un pointeur « ballants », ou une expression qui indexe un tableau au-delà de ses limites. Des catégories entières d'insectes qui infestent régulièrement des programmes C et C ++ sont ainsi éliminés.
Considérations sur la migration
Afin de discuter des problèmes potentiels avec le code dangereux explorons l'exemple suivant. Notre code managé fait des appels à une DLL non géré. En particulier, il existe une méthode appelée GetDataBuffer qui retourne 100 articles (pour cet exemple, nous revenions un nombre fixe d'éléments). Chacun de ces éléments est constitué d'un nombre entier et un pointeur. Le code exemple ci-dessous est un extrait du code managé montrant la fonction dangereuse responsable de la manipulation de ce retour des données.
Le UnsafeFn boucle à travers les éléments 100 et additionne les données de nombres entiers. Comme nous marchons à travers un tampon de données, le code doit enjamber l'entier et le pointeur. Dans l'environnement 32 bits ce code fonctionne très bien. Cependant, comme nous l'avons mentionné précédemment, les pointeurs sont 8 octets dans l'environnement 64 bits et par conséquent le segment de code (ci-dessous) ne fonctionnera pas correctement, car il fait appel à une technique de programmation commune, par exemple le traitement d'un pointeur comme équivalent à un nombre entier.
Comme nous venons de le voir, il y a des cas où l'utilisation du code non sécurisé est nécessaire. Dans la plupart des cas, il est nécessaire en raison de la dépendance de code managé sur une autre interface. Quelles que soient les raisons existe code non sécurisé, il doit être examiné dans le cadre du processus de migration.
L'exemple ci-dessus, nous avons utilisé est relativement simple et la solution pour faire fonctionner le programme 64 bits était simple. Il est clair qu'il existe de nombreux exemples de code dangereux qui sont plus complexes. Certains nécessiteront un examen en profondeur et peut-être pas en arrière et de repenser l'approche du code managé utilise.
Pour répéter ce que vous avez lu utilisant déjà un code dangereux dans votre application gérée ne signifie pas que la migration vers la plate-forme 64 bits ne sera pas possible. Cela ne signifie pas qu'il y aura des problèmes. Ce que cela signifie est que vous devez examiner tout le code dangereux votre application gérée a et déterminer s'il y aura des problèmes.
Considérations sur la migration
LayoutKind.Sequential
Passons en revue la définition fournie dans le kit de développement .NET Framework Aide:
« Les membres de l'objet sont disposés séquentiellement, dans l'ordre dans lequel elles apparaissent lors de l'exportation vers la mémoire non géré. Les membres sont disposés selon l'emballage spécifié dans StructLayoutAttribute.Pack. Et peuvent être non contiguës. »
Voici une question que nous devons porter une attention particulière à l'emballage, et en même temps, essayer de laisser la loi sur le système dans son mode préféré.
Ce qui suit est un exemple d'une structure telle que définie dans le code managé, ainsi que la structure correspondante définie dans le code non géré. Vous devez prendre note de la façon dont cet exemple illustre la définition de la valeur pack dans les deux environnements.
L'analyse de votre code indiquera si les binaires séparés sont nécessaires pour chacune des plates-formes et si vous aussi d'apporter des modifications à votre code non managé pour résoudre les problèmes comme l'emballage.
Migration et sérialisation
La sérialisation est le processus consistant à convertir l'état d'un objet en une forme qui peut être persisté ou transporté. Le complément de sérialisation désérialisation est, qui convertit un courant dans un objet. Ensemble, ces processus permettent facilement les données stockées et transférées.
Le .NET Framework propose deux technologies de sérialisation:
- sérialisation binaire préserve la fidélité de type, qui est utile pour la préservation de l'état d'un objet entre les différentes invocations d'une application. Par exemple, vous pouvez partager un objet entre les différentes applications par sérialisation le Presse-papiers. Vous pouvez sérialiser un objet à un flux, sur un disque, à la mémoire, sur le réseau, et ainsi de suite. NET Remoting utilise sérialisation pour passer des objets « de la valeur » d'un domaine informatique ou une application à l'autre.
- sérialisation XML sérialise uniquement les propriétés publiques et les champs et ne préserve pas la fidélité de type. Ceci est utile lorsque vous souhaitez fournir ou consommer des données sans restreindre l'application qui utilise les données. Parce que XML est un standard ouvert, il est un choix attrayant pour le partage des données sur le Web. SOAP est également un standard ouvert, ce qui en fait un choix attractif.
Considérations sur la migration
Quand on pense à la sérialisation nous devons garder à l'esprit ce que nous essayons de réaliser. Une question à garder à l'esprit que vous migrez à 64 bits est de savoir si vous avez l'intention de partager des informations sérialisé entre les différentes plates-formes. En d'autres termes, les informations seront de lecture (ou deserialize) d'application gérée 64 bits stockés par une application gérée 32 bits.
Votre réponse contribuera à stimuler la complexité de votre solution.
Donc, après tout cela, quelles sont les considérations relatives à la sérialisation?
- IntPtr est soit 4 ou 8 octets de longueur en fonction de la plate-forme. Si vous sérialiser les informations vous écrivez des données spécifiques à la plate-forme à la sortie. Cela signifie que vous pouvez et vous rencontrer des problèmes si vous essayez de partager ces informations.
La migration vers 64 bits est à venir et Microsoft travaille à faire la transition entre les applications gérées 32 bits à 64 bits aussi simple que possible.
Cependant, il est irréaliste de supposer que l'on peut simplement exécuter du code 32 bits dans un environnement 64 bits et ont courir sans regarder ce que vous migrez.
Comme mentionné précédemment, si vous avez 100% sûr du code de type géré, alors vous pouvez vraiment simplement le copier sur la plate-forme 64 bits et l'exécuter avec succès sous le CLR 64 bits.
Mais plus que probable que l'application gérée sera impliqué dans tout ou partie des éléments suivants:
Peu importe lequel de ces choses que votre demande fait il va être important de faire vos devoirs et enquêter sur ce que votre code est en train de faire et ce que les dépendances que vous avez. Une fois que vous faites ce travail à domicile, vous devrez regarder vos choix à faire tout ou partie des éléments suivants:
Vous devez également être au courant des outils disponibles pour vous aider dans votre migration.
zone Il a également géré des fonctions de bibliothèque pour vous aider à l'exécution pour déterminer quel environnement vous exécutez dans.
- System.IntPtr.Size -pour déterminer si vous exécutez en 32 bits ou 64 bits
- System.Reflection.Module.GetPEKind -pour interroger un programme .exe ou .dll pour voir si elle est censée fonctionner que sur une plate-forme spécifique ou sous WOW64
Il n'y a pas ensemble spécifique de procédures pour faire face à tous les défis que vous pourriez rencontrer. Ce livre blanc vise à vous sensibiliser à ces défis et vous présenter des solutions de rechange possibles.
Afficher: Protégé Hérité