.NET identificateur d'objet unique

Est-il un moyen d'obtenir un identifiant unique d'une instance?

GetHashCode() est le même pour les deux références pointant vers la même instance. Cependant, deux cas peuvent (assez facilement) obtenir le même code de hachage:

Hashtable hashCodesSeen = new Hashtable();
LinkedList<object> l = new LinkedList<object>();
int n = 0;
while (true)
{
    object o = new object();
    //Remember objects so that they don't get collected.
    //This does not make any difference though :(
    l.AddFirst(o);
    int hashCode = o.GetHashCode();
    n++;
    if (hashCodesSeen.ContainsKey(hashCode))
    {
        //Same hashCode seen twice for DIFFERENT objects (n is as low as 5322).
        Console.WriteLine("Hashcode seen twice: " + n + " (" + hashCode + ")");
        break;
    }
    hashCodesSeen.Add(hashCode, null);
}

Je suis en train d'écrire un débogage addin, et j'ai besoin d'obtenir une sorte de ID pour une référence qui est unique au cours de l'exécution du programme.

J'ai déjà réussi à obtenir l'ADRESSE interne de l'instance, ce qui est unique jusqu'à ce que le garbage collector (GC) compacte le tas (= déplace les objets = changements d'adresses).

Pile Overflow question L'implémentation par défaut de l'Objet.GetHashCode() pourrait être liée.

Les objets ne sont pas sous mon contrôle que je suis l'accès aux objets dans un programme en cours de débogage à l'aide de l'API de débogueur. Si j'étais en possession des objets, en ajoutant mes propres identifiants uniques serait trivial.

Je voulais l'ID unique pour la construction d'une table de hachage ID -> objet, pour être en mesure de recherche déjà vu des objets. Pour l'instant je l'ai résolu comme ceci:

Build a hashtable: 'hashCode' -> (list of objects with hash code == 'hashCode')
Find if object seen(o) {
    candidates = hashtable[o.GetHashCode()] //Objects with the same hashCode.
    If no candidates, the object is new
    If some candidates, compare their addresses to o.Address
        If no address is equal (the hash code was just a coincidence) -> o is new
        If some address equal, o already seen
}