Listing 1: The pin_cast<> struct pin_cast.h
#pragma once #include <vcclr.h> using namespace System::Runtime::InteropServices; template <class T> struct pin_cast { private: intptr_t _handle; T* operator& (); // hidden zero-param construct pin_cast(); public: pin_cast(Object* o) { _handle = GCHandle::op_Explicit (GCHandle::Alloc(o, GCHandleType::Pinned)) #ifdef _WIN32 .ToInt32() #elif defined(_WIN64) .ToInt64() #else #error ERROR: either _WIN64 or _WIN32 must be defined #endif ; } ~pin_cast() { System::Runtime::InteropServices::GCHandle::op_Explicit (_handle).Free(); _handle = 0; } operator T () const { return reinterpret_cast<const T> (System::Runtime::InteropServices::GCHandle::op_Explicit(_handle) .AddrOfPinnedObject().ToInt32()); } }; End of Listing