On Fri, 2005-10-21 at 01:38 -0700, itsme notyou wrote:
> I am not clear about how the CLR will act if we pass a reference OR
> pointer to a unmanaged code via Pinvoke. ( Both are treated alike with
> the only diff being we need to encapsulate the code using '&' with
> UNSAFE and pin the location ????? )
>
> I read the useful article by Jon Pryor
> (http://www.mono-project.com/index.php?title=Interop_with_Native_Libraries&redirect=no).
> It states the 4 steps for marshaling...what happens if you pass a
> NON_BLITTABLE STRUCTURE by reference (without pinning it) or pass a pointer
> to this structure.
Structures are on the stack, and thus don't need to be pinned. If the
structure isn't blittable, the runtime will marshal the structure to
unmanaged memory (creating a copy), and pass a pointer to the marshaled
copy to the unmanaged function. If [In, Out] was applied to the
P/Invoke parameter, the copy will be unmarshaled into the original
structure.
The same will happen for classes with a [StructLayout] attribute.
> Will this be
>
> Content of pointer copied to UM memory---- > marshaling done --- >
> ( Unmanaged code makes operates on it / changes ) ---> result
> marshaled BACK to managed types ---> result copied to managed memory
Yes.
> And do the above steps take place for "class pass by reference" ???
Yes.
There is one caveat: if Mono cannot marshal the class/structure, for
whatever reason, the process will be aborted. Goodbye, cruel world...
See also:
http://lists.ximian.com/pipermail/mono-list/2005-October/029117.html
- Jon
_______________________________________________
Mono-list maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-list