There is a difference between unmanaged and non-managed pointers.
A managed pointer is a handle to an object on the managed heap, and AFAIK is available in managed C++ only. It is equivalent of C# reference to an object. Unmanaged pointer, on the other hand, is equivalent of a traditional C-style pointer, i.e. address of a memory location; C# provides unary &
operator, fixed
keyword and unsafe
context for that.
You are trying to get a pointer to a managed field (dynamic
is actually System.Object
is disguise), while C# allows pointers to unmanaged objects only, hence the wording: your type is non-unmanaged.
A bit more on this here.
Update: to make it more clear, managed C++ supports classic C-style pointers and references. But to keep C++ terminology consistent, they are called unmanaged and managed pointers, correspondingly. C# also supports pointers (explicitly in unsafe
context) and references (implicitly whenever objects of reference types are involved), but the latter is not called "managed pointers", they are just references.
To sum up: in C++ there are unmanaged and managed pointers, in C# - unmanaged pointers and references.
Hope it makes sense now.