No, the compiler will not let you do this. Not even a C-style cast or reinterpret_cast<>() will work, the biggest weapons you have available.
This is for a very good reason, managed structs are quite incompatible with unmanaged structs. First issue is layout, the exact order and offset of the members of the struct. Which is technically the smaller problem, the CLR already makes an attempt at keeping them the same. Usually it is a match, not always. You'll find more details in this post.
The much bigger issue is storage, managed structs tend to be allocated at an address that can randomly change. A side-effect of having a garbage collector, one of its duties is not only release unused memory but also compact the heap. Very incompatible with the way your native code is going to use the pointer you pass, it is randomly going to dereference the struct at an incorrect address. Either because it released the enclosing object or because it moved it. Extraordinarily difficult to debug since it happens so rarely and is completely undeterministic since it depends on other managed threads that allocate.
So it just plain forbids it. A structure must be marshaled, copied into unmanaged memory and rearranged to match the native layout. The universal helper function is Marshal::StructureToPtr(). But quite unnecessary for such a small structure, it is much faster and simpler to copy the fields yourself:
Byte Init(NDeviceDest pos, unsigned param) {
DeviceDest unmanagedPos = { pos.IP, pos.pos };
m_pDockMaster->Init(&unmanagedPos, param);
//...
}
Which fulfills the requirements, it has guaranteed the correct layout. And is allocated in stable memory, the GC doesn't mess with stack locations and memory is stable for the duration of the method body execution. In case it needs to be said, probably not, be sure that "DockMaster" doesn't store the passed pointer.