There is no difference. If you look at the code from Marshal.ReadInt32 , you will see that it uses pointers to do the same.
The only “advantage” with Marshal is that you do not need to explicitly allow unsafe code. IIRC, you also need FullTrust to run unsafe code so that this can be considered.
source share