ok : marshal (avec un seul "l" donc) est utilisé tant pour la sérialisation que pour naviguer dans le segment de données. Le rôle du GC étant de réorganiser les données pour faire face à un besoin de mémoire, il est normal qu'il utilise marshal et que ce même marshal se plaigne de ne rien pouvoir retrouver si - par exemple - on se risque à passer un pointeur sur une donnée marshalée dans une propriété de dll ou dieu sait quoi d'autre qui ne se trouve pas dans la liste de sérialisation. Quand la GC risque de ne pas pouvoir travailler , c'est donc marshal qui se plaint. Je n'ai jamais vu passer de message d'erreur qui fasse référence au GC. Je ne ferai pas de recherche sur ce point car il fonctionne très bien et je n'ai pas d'autre intention que d'évaluer ses limites.
D'autre part, la sérialisation et l'utilisation de la classe marshal fonctionne très bien avec l'unmanaged code désactivé, c'est le cas de mon dernier projet ou un collaborateur a utilisé massivement la classe marshal sur des structures binaires.
Enfin pour une raison que j'ignore, l'appel de dll "classiques" ne requiert pas l'utilisation du code non managé alors qu'elle est écrite en C et que le tout fonctionne très bien avec d'anciennes versions de c ou même de purebasic sur lequel j'ai fait plusieurs tests.
<DllImport("Kernel32", ExactSpelling:=True, SetLastError:=True)>
Comme je l'ai dit , je n'utilise pas le code non managé auquel je préfère le C classique, beaucoup plus rapide sur certaines opérations et qui ne me force pas à galérer avec des classes aussi opaques que marshal justement.
En C un champ de bits se déclare comme une structure, la pile est bcp plus petite, le heap beaucoup plus grand et on peut y faire des opérations sur toutes les données à la vitesse du processeur sans framework interposé, exactement comme en assembleur qui n'est pas plus rapide pour ce genre de tache.
Mais si ton job relève de la gestion ou orienté académique, je n'argumenterai pas plus avec toi car je teste tout là ou toi tu lis la doc !
Partager