Frage

Gibt es eine Möglichkeit, die „Adresse“ ein Objekt zu bekommen? Dies ist zu Demonstrationszwecken, Ich weiß, dass dies eine schlechte Idee ist, im Allgemeinen und wenn es funktioniert überhaupt dann als unsafe Code. Das Projekt ist so abgestimmt, unsicheren Code zu ermöglichen. Allerdings waren meine Versuche erfolglos. Der Code habe ich bisher nicht kompilieren:

    unsafe static String AddressOf(Object o)
    {
        void* p = &o;
        return String.Format("{0}", new IntPtr(p));
    }

Error: Cannot take the address of, get the size of, or declare a pointer to a managed type ('object')

Auch wenn die Speicheradresse kann nicht retrieven wird, dann vielleicht ein Speicher-Slot oder etwas anderes der Position des Objekts zeigt.

. Hintergrund: meine Absicht ist, einige Demo zeigt die Unterschiede zwischen vorbei Wert oder als Referenz zu machen und die Position dieser Objekte Dump

ADDED 2010-06-27:

ich abandonned schließlich die Idee selbst es aus dem .NET-Programm zu tun. Scheint nicht zu einer guten Lösung zu führen. Auch wenn es funktioniert, hätte es so sehr den Code überladen hat, dass Sie kaum das Ergebnis auf einfache Art und Weise erklären und es für einige Demo-Zwecke verwenden. Ich mag jetzt tut es mit einem guten (dh CLR bewusst) Debugger in der Art und Weise, die unten in der Antwort adviced wird.

Debuggen kann durch Aktivierung eine Option in den Konfigurationseinstellungen Enable Unmanaged Debugging leider nicht in der kostenlosen Ausgabe von Visual Studio (die einzige Version, die ich zu Hause habe jetzt) ??innerhalb VS verbessert werden. Gibt es eine Möglichkeit Enable Unmanaged Debugging Arbeit manuell zu machen?

Nach ein bisschen kämpfen installiert ich Debugtools für Windows die gibt mir den WinDbg. Großes Werkzeug I Jahre für die Treiberentwicklung vor verwendet. Jetzt ist es Teil eines riesigen Paket. Ich habe versucht, die Anweisungen zu befolgen, die Sos.dll Weise ohne Erfolg arbeiten zu bekommen. Ich kann nicht einmal diese DLL finden. Auch diese Lösung scheint die Enable Unmanaged Debugging Flagge im Projekt zu benötigen ...

War es hilfreich?

Lösung

Um die Demo sinnvoll zu machen, müssen Sie zuerst das Objekt fixieren.

GCHandle handle = GCHandle.Alloc(o, GCHandleType.Pinned);
IntPtr address = handle.AddrOfPinnedObject();

Ich würde zeigen, mit SOS (Teil der Debugging-Tools für Windows-Paket). Sie und Ihr Publikum gewinnen tatsächlich einige wertvolle Fähigkeiten auf diese Weise, und nicht nur von Hand winken über CLR Implementierungsdetails.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top