[Mono-list] Mono/.NET delegate incompatibility

dietmar dietmar@ximian.com
20 Dec 2002 09:49:48 +0100


Please file a bug.

- Dietmar

On Thu, 2002-12-19 at 20:42, J. Perkins wrote:
> Hang on a minute, I answered this too soon. I'm not talking about
> calling a DLL function. [DllImport] works just fine on both Windows
> and
> Linux. I am talking about a callback function, from unmanaged ->
> managed
> code. That is, a C# delegate passed to and called from unmanaged code
> via a function pointer. Here's a usenet thread on the subject:
> 
>  http://makeashorterlink.com/?C417214D2
> 
> The problem described in this thread is reversed for Mono: the
> callback
> must use the cdecl convention. Because of this, there is no way to
> write
> a C function that can call a delegate under both .NET and Mono. If I
> do
> this:
> 
>   int SomeCFunction(int (__stdcall *callback)(int, int, int))
>   {  return callback(1,2,3); }
> 
> ...it will corrupt the stack when run under Mono on Windows. If I use
> cdecl instead:
> 
>   int SomeCFunction(int (*callback)(int, int, int))
>   { return callback(1,2,3); }
> 
> ...it will corrupt the stack when run under .NET. Maybe I'm missing
> something (quite possible), but it appears that Mono must use
> __stdcall
> for delegates on Windows.
> 
> I'll give you guys a chance to sanity check my rambling. If it holds
> up
> I will file a bug. 
> 
> Jason
> 379
> 
> 
> > > I guess the default calling convention in mono is cdecl. 
> According to
> > > MSDN, the default calling convention for dllimport should be
> stdcall
> > > (which IMHO really only makes sense on windows).
> > > 
> > > You could try setting the CallingConvention property on the
> DllImport to
> > > cdecl.
> 
> 
> 
> 
> _______________________________________________
> Mono-list maillist  -  Mono-list@ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-list
>