[Mono-dev] PInvoke and language interopelability

Alfredo José Muela Romero alfredoj.muela at gmail.com
Tue Jan 13 11:17:46 EST 2009


2009/1/13 Jonathan Pryor <jonpryor at vt.edu>

> On Tue, 2009-01-13 at 16:13 +0100, Alfredo José Muela Romero wrote:
> > My current problem, which I'm running out of ideas :/ is about how to
> > get a call from the dinamic to the wrapped code.
> >
> > Let's say I have a dynamic library (in C++ for instance) which
> > implements a Model-View-Controller pattern. In that library exists a
> > method which receives a pointer to an object as a parameter in order
> > to notify later changes.
> >
> > Does anyone know a way to get that call to the C# code
>
> Delegates are your friend.  Delegates marshal to a function pointer that
> can be called from C/C++ code, e.g. given:
>
>        delegate int Foo (string s);
>        [DllImport] static extern void PerformCallback(Foo f);
>
>        ...
>        Func<string, int> f = s => s.Length;
>        PerformCallback (f);
>        f = null;
>
> The C++ code would be:
>
>        void PerformCallback(int (*cb)(const char* s))
>        {
>                cb ("hello!");
>        }
>
> This works pretty well for functions.  If you need to pass actual C++
> objects around, things get more complicated.  You might be able to
> create a C# class/structure to mirror the C++ type, but such things can
> get ugly, quick.
>
> Note: delegates passed to native code are only valid for as long as the
> managed delegate exists.  In the above code, the native callback will
> only be valid for the life of the PerformCallback() call.  If you need
> it to last longer, you'll need to store the delegate as a member and
> otherwise ensure it isn't collected.
>
>  - Jon
>
>
>
Hi Jon,

I'm aware about the delegate's marshalling, as I far as I understood and
test them they seemed pretty much as a function pointer... I'm glad I got it
right :)

The issue is about giving the pointer to the object and access to the method
through the object.

My thoughts were now on giving an extra functionallity to a proxy class
which would use that function pointer (delegate in C#) to perform the
callback. However, I guess that adding that indirection level may not be too
"elegant" :S
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/pipermail/mono-devel-list/attachments/20090113/b818cf2c/attachment.html 


More information about the Mono-devel-list mailing list