le codage correct pour l'instruction CIL sur ma machine à petite Endian, Cela signifie, sérialisation d'un est le commandement d'octets de L'étape 4 ci-dessus sur une machine Big-Endian entraîne également le mauvais ordre d'octets? C'est-à-dire que
rethrow code>
est la séquence de deux octets Fe 1a code >. p> li>
opcodes.rethrow.value code>
(qui a type court code>) a la valeur
0xfe1a code > sur ma machine petite-Endian. P> li>
bitconverter code>
honore l'endansement de la machine lors de la conversion / de séquences d'octets. P> li>
bitconverter.getbytes (opcodes.rethrow.value) code> Résultats dans la séquence d'octets
1a Fe code>. P> < / li>
ol>
opcode.value code> sur une machine à petite Endian utilisant
bitconverter code> ne produit pas le codage correct pour le code OP; L'ordre des octets est inversé. P>
opcode.value code>
documenté (et si oui, où?) Ou est-ce un "détail de mise en œuvre"? p> li>
opcodes.rethrow.value code> soit
0x1afe code> sur une machine Big-Endian? P> li>
ul>
3 Réponses :
La propriété de valeur ressemble à ceci dans la source de référence:
foo.m_s1 = opc.Value >> 8; foo.m_s2 = opc.Value & 0xff; foo.m_size = opc.Size;
"Ça ne fait pas quel internalemit () fait" i>: es-tu alors que l'ordre des octets dans opcode.value code> est un détail de mise en œuvre (interne)? Ou est-ce que le source de référence .NET a réellement le caractère d'une spécification publique?
La propriété opcode.Value n'est pas un détail de mise en œuvre interne. C'est juste une propriété publique qui vous i> peut utiliser, la mise en œuvre ne l'utilise pas.
Veuillez relire ma question: je ne demande pas à propos de opcode.value code> lui-même, mais sur son ordre d'octet i>.
"qui n'a pas de dépendance de l'endian-ness i>": vous vous prouvez comme vous traitant du code qui effectue des opérations de bits. Vous en basez sur votre connaissance de la source de référence, que l'OMHO ne peut remplacer une spécification ou une documentation publique. Même si: avec des déclarations telles que "le faire comme le cadre fait" I>, vous avez réellement aidé à dessiner mes propres conclusions, à savoir que nous parlons de quelque chose qui est en fait non documenté.
Note latérale: Il y a une inexactitude mineure dans votre réponse: Contrairement au code OP, il est i> Autres données dans un ruisseau d'octets d'instructions CIL qui a une certaine endansion (toujours petite-Endian Afaik): par exemple. jetons de métadonnées intégrées ou décalages relatifs indiquant des cibles de succursales.
J'ai atteint la conclusion qui sérialisant une représentation de code OP basée sur la propriété est une mauvaise idée, mais Non pas à cause de l'utilisation de Il indique que cette propriété contient "la valeur de l'opérande immédiate", qui peut ou non se référer au codage du code OP; Ce terme n'apparaît nulle part dans la spécification CLI. p> li>
Même lorsque nous supposons que ce est en fait em> contient le codage d'un code OP, la documentation ne dit rien à propos de l'ordre d'octet. (L'ordre d'octet est entré en jeu lors de la conversion entre Pourquoi suis-je en train de baser mon argument sur la documentation MSDN et non sur la norme CLI? Parce que conclusion: strong> p> < P> Il existe deux façons de sortir le codage de code OP pour un séjour avec Créez votre propre mappage entre les codages de code OP (I.E. opcode.value code>, c'est-à-dire:
bitconverter.getbytes (court) code>
, dont le comportement est bien documenté. Le principal culprit est le opcode.value code> Propriété, dont la documentation est vague à deux égards: p>
octet [] code> et
court code>.) P> li>
ol>
system.reflet.emit code> ne fait pas partie de la bibliothèque de réflexion telle que définie par la norme CLI. Pour cette raison, je pense qu'il est assez sûr de dire que La documentation de référence MSDN pour cet espace de noms est aussi proche que possible dans une spécification officielle. (Mais contrairement à la réponse de @hans Passant, je ne prendrais pas une étape plus loin et affirmant que la source de référence est de quelque manière qu'une spécification.) P>
OPCODE CODE> OPCODE PT> P>
system.reflet.emit code> fonctionnalité et utilisez
iLGenerator.emit (quelqueopcode) code>. Cela peut être trop restrictif dans certaines situations. P> LI>
octet [] code> séquences) et les différents
opcode code> objets. P> li>
ul> p>
Alternative: N'utilisez pas d'objets code> opcode code> si vous n'utilisez pas de réflexion? Si vous aimez simplement utiliser opcodes.Rethrow.value code> pour la lisibilité, vous pouvez obtenir la même chose en utilisant Mono Cecil's
OPCODES code>
classe; Son OPCODE CODE> A > STRIT a explicitement
op1 code> et
op2 code> propriétés.
Essayez:
var yourStream = MemoryStream(); var writer = new System.IO.BinaryWriter(yourStream); writer.Write(OpCodes.Rethrow.Value);
Vous ne saurez pas si vous essayez la mise en œuvre. Je travaille pratiquement avec ce truc tous les jours depuis que je réécrit actuellement System.reflection. * À partir de zéro, oui, je sais. :)
S'il vous plaît ne me méprenez-vous pas: j'espère que vous connaissez vos affaires, et je crois que votre code pourrait simplement fonctionner correctement. Mais je demandais une documentation (si elle existe) parce que je préférerais si mon code (qui est une bibliothèque qui étend system.reflet code> btw.) Ne s'appuyait pas réellement sur un comportement sans papiers d'une implémentation de la norme CLI.
Je viens d'essayer votre code. Malheureusement, ça ne fait pas la bonne chose. Documentation pour BinaryReader.Write (court) code> A> dit: "BinaryWriter stocke ce type de données au petit format Endian." I>. Je l'ai essayé et, en effet, vous finissez par
1a code> écrit dans le flux avant
Fe code>.
Vous ne pouvez pas combiner l'opcode comme ça. Le lecteur de métadonnées nibrera le contenu et lors de la recherche
Fe code> saura qu'il s'agit d'une version longue. Si cela représentait l'inverse, alors vous auriez du mal à le lire.
@Leppie: Je sais que
Fe code> doit apparaître d'abord dans le flux d'octets d'instructions. Ma question concerne l'ordre d'octet des codages de code OP tel que stocké dans
opcode.value code>.
Probablement pour une lecture plus facile :)