Tout d'abord, un avertissement: ce qui suit strictement dans le domaine de laide sans-papiers hacks. Ne comptez pas sur ce travail - même si cela fonctionne pour vous maintenant, il peut cesser de fonctionner demain, avec toute personne mineure ou majeure .Mise à jour NET.
Vous pouvez utiliser les informations contenues dans cet article sur CLR internes - dernière, j'ai vérifié, il était encore en vigueur. Voici comment cela est fait (il récupère l'intérieur "de Base de la Taille de l'Instance du" champ via TypeHandle
de la type).
object obj = new List<int>(); // whatever you want to get the size of
RuntimeTypeHandle th = obj.GetType().TypeHandle;
int size = *(*(int**)&th + 1);
Console.WriteLine(size);
Cela fonctionne sur 3.5 SP1 32-bit. Je ne suis pas sûr si les tailles sont les mêmes sur 64 bits, vous pourriez avoir à ajuster les types et/ou des compensations si ils ne le sont pas.
Cela fonctionne pour tous "normal", qui de toutes les instances de la même, bien des types définis. Ceux pour qui ce n'est pas vrai, sont des tableaux et chaînes de caractères pour vous, et je crois aussi StringBuilder
. Pour eux, vous devrez ajouter la taille de tous les éléments contenus à leur base et la taille de l'instance.