From Jason Olson.
//code starts here
#pragma
once
#include <msclr\marshal.h>
#include <msclr\marshal_windows.h>
namespace
msclr {
namespace interop {
////////////////////////////////////////////////////////////////////
// GUID Conversions
////////////////////////////////////////////////////////////////////
template<>
inline _GUID marshal_as<_GUID, System::Guid>(const System::Guid& from) {
System::Guid^ source = from;
array<Byte>^ guidData = source->ToByteArray();
pin_ptr<Byte> data = &(guidData[ 0 ]);
return *(_GUID *)data;
}
template<>
inline Guid marshal_as<System::Guid, _GUID>(const _GUID& from) {
return System::Guid( from.Data1, from.Data2, from.Data3, from.Data4[ 0 ], from.Data4[ 1 ],
from.Data4[ 2 ], from.Data4[ 3 ], from.Data4[ 4 ], from.Data4[ 5 ],
from.Data4[ 6 ], from.Data4[ 7 ] );
}
}
}
//code ends here
At first glance the pin_ptr is a little scary, but this code doesn't return it, it dereferences it. So no "GC hole" to worry about.
Kate