GCHandle pour obtenir une adresse(pointeur).net objet
J'ai réussi à obtenir l'adresse d'un .net de l'objet par
GCHandle objHandle = GCHandle.Alloc(obj,GCHandleType.WeakTrackResurrection);
int address = GCHandle.ToIntPtr(objHandle).ToInt32();
et je me souviens de l'objet par
Object obj = GCHandle.FromIntPtr(IntPtr(address)).Target;
Bien, le but est de stocker l'adresse dans une classe native et de disposer d'une information dont l'objet natif est releated à qui .nette de l'objet.
Autant que je sache, l'adresse ne change pas, parce que de allocing, est-il vrai ou est-ce quelqu'un a une meilleure idée de servir mon but?
Grâce
est-il possibilité de définir la valeur de "épinglé objet" comme : GCHandle.FromIntPtr(IntPtr(adresse)).Target = myNewObject ??
Je ne sais pas si il est légal pour définir la
Je ne sais pas si il est légal pour définir la
Target
de la propriété. Pourquoi ne pas demander?OriginalL'auteur ali_bahoo | 2010-11-04
Vous devez vous connecter pour publier un commentaire.
Comme Tim et thecoop l'a souligné, GCHandle.Alloc peut empêcher la collecte des ordures mais réelle de l'objet, l'adresse peut changer à mesure que la GC peut déplacer les objets à moins que vous épinglez l'objet. De plus, votre code à l'aide de
GCHandleType.WeakTrackResurrection
et qui ne serait pas d'événement empêcher la collecte des ordures.GCHandle.ToIntPtr
donnera l'adresse de la poignée qui peut être aller-retour sur appel non géré. Objet réel à l'adresse sera communiquée parAddrOfPinnedObject
méthode.Dit, l'OMI, votre code peut servir le but de l'association .NET d'objet à objet non géré. C'est parce que GCHandle.D'/FromIntPtr vais revenir vous corriger GCHandle et vous pouvez atteindre votre .NET de l'objet via (à condition que sa ne sont pas des déchets collectés). OMI, il devrait être négligeable si l'objet réel de l'adresse a changé ou pas.
Pourquoi ne pas utiliser GCHandleType.Normal - qui permettrait d'éviter la collecte des ordures.
Sur la deuxième pensées, il peut ne pas fonctionner - par exemple, si vous créez GCHandle dans une méthode, il faut de l'adresse via ToIntPtr et passer le code non managé et puis faire de la poignée.Gratuitement, parce que sa va hors de portée alors Libre de l'appel serait de faire l'objet de admissibles pour le GC. Si vous êtes dans un tel scénario, je dirais que vous pouvez créer un dictionnaire statique/liste de vos objets de façon à empêcher la collecte des ordures.
Je vais créer et de maintenir le GCHandle varible à l'intérieur de l' .nette de l'objet. Donc, si l'objet reste, la poignée rester aussi. J'ai utilisé GCHandleType.De type Normal mais dès que les objets sont créés de la mémoire augmente de façon constante, parce que les poignées sont conservées en tant que membre de l'objet. Mais il est indispensable que les objets avec la faiblesse de la poignée de types sont sûrement GC recueillies lors de l'forcé GC.la collection est appelée.
OriginalL'auteur VinayC
Vous aurez envie de la broche de la GCHandle pour arrêter les objets en mouvement autour de, la table se déplace les objets autour de, de sorte qu'un désépinglé pointeur pourrait devenir invalide. L'épinglage de l'objet cesse de bouger:
Vous aurez également pour libérer la poignée lorsque vous avez terminé:
Où faut-il dire cela?
msdn.microsoft.com/en-us/library/1246yz8f(v=VS.80).aspx et les erreurs du compilateur
Je pense qu'il a raison, il doit être épinglé. Qu'est-ce qu'blittable? Voir le commentaire sur la MSDN "Si vous ne pouvez pas obtenir un épinglé GC Poignée pour une classe, vous êtes probablement manque quelques [StructLayout(LayoutKind.*)] dans vos définitions de type."
OriginalL'auteur thecoop
Ce que vous obtenez n'est pas réellement une adresse.
Comme vous le remarquez, il semble agir comme une adresse la plupart du temps, et vous pouvez vous rappeler l'objet, en utilisant GCHandle.FromIntPtr. Cependant, la question intéressante est que vous utilisez GCHandleType.WeakTrackResurrection.
Si votre faiblement objet référencé obtient collectées (il peut probablement en faire, puisqu'il n'est que faiblement référencé par le GCHandle), vous avez toujours la IntPtr, et vous pouvez le passer à GCHandle.FromIntPtr(). Si vous le faites, alors vous obtenez de retour null, en supposant que le IntPtr n'a pas été recyclé.
(Si le IntPtr a été recyclé par le CLR pour une raison quelconque, alors vous êtes en difficulté. Je ne suis pas sûr de savoir si cela peut se produire.)
Vous êtes mieux d'utiliser soit GCHandleType.Normal, ou GCHandleType.Épinglé (si vous avez besoin de prendre l'adresse de l'objet dans le code non managé), si vous voulez une référence forte à l'objet.
(Utiliser GCHandleType.Épinglé, votre objet doit par exemple être primitif, ou ont [StructLayout] attribut, ou un tableau de ces objets.)
OriginalL'auteur Tim Lovell-Smith
L'adresse d'un objet géré ne changement. Le garbage collector est libre de déplacer des objets en mémoire. Lorsque le garbage collector s'exécute, il collecte des objets inutilisés, puis réorganise les objets restants pour réduire la taille globale du tas managé.
Je ne suis pas sûr que vous allez trouver un bon moyen de garder un pointeur d'un objet géré pendant de longues périodes de temps. Il est possible d'épingler les objets en mémoire, et obtenir leur adresse de cette façon, mais en C#, il est possible de déterminer les objets à l'intérieur d'une seule méthode.
Il serait utile si vous l'explique plus en détail ce que vous allez faire avec le pointeur une fois que vous l'avez.
OriginalL'auteur Tim Robinson