[Mono-dev] Registering internal calls at runtime

Michel Boissé mboisse at noesisinnovation.net
Mon Jul 12 19:05:19 EDT 2010


Thank you Robert, I appreciate your involvement.

Here's our problem: any calls to mono_add_internal_call is ineffective when 
made from managed code.
Our initial idea was to use P/Invoke to load a dynamic library and run some 
initialization method in it which would make the appropriate registrations. 
Based on tests we did, any call which doesn't precede the mono_jit_exec call 
has no effect.

Which of these assumptions can we make?
  Do classes using internal calls have their methods bound to internal 
methods as soon as their owning assembly is initialized?
  Or is the internal method registry is simply completely sealed once 
mono_jit_exec is running?

I was hoping the binding process was done "on request", only the first time 
a method is called from managed code (because an exception is thrown only 
when a call to the unfound internal method is made).

Actually, internal method declarations in the managed code like
  [MethodImplAttribute(MethodImplOptions.InternalCall)]
would be considerably more powerful if it allowed a module and a method 
symbol to be supplied directly some way like this:
  [MethodImplAttribute(MethodImplOptions.MonoNativeCall, 
"MyDynamicLibrary.dll", "MyMethod")]

This last approach gives us a bunch of important features:
  1) Late binding to dynamic libraries implementing managed classes in C 
becomes possible.
  2) No fancy registration mechanism (as suggested, and yet not totally 
working / risk free for late binding scenarios) is necessary from the 
unmanaged code to register methods.
  3) Dynamic library loading can be made implicitly (from the explicit 
dependency embodied by the attribute declaration).

I wish something like that existed to call native code. Please tell me 
there's a way.

Cheers

--------------------------------------------------
From: "Robert Jordan" <robertj at gmx.net>
Sent: Monday, July 12, 2010 5:35 PM
To: <mono-devel-list at lists.ximian.com>
Subject: Re: [Mono-dev] Registering internal calls at runtime

> On 12.07.2010 21:43, MBoisse wrote:
>>
>> Has there been any improvements regarding late registrations of internal
>> methods at runtime using "mono_add_internal_call"?
>>
>> Would it make sense to load and register C functions in a dll from 
>> managed
>> code, and only then have the assembly referring to them loaded?
>>
>> There are many scenarios in which the C functions we need to make calls 
>> to
>> aren't known at compile time of the embedding unmanaged code (ie 
>> mono.exe)
>> and therefore registrations can't be made before the call to 
>> mono_jit_exec
>> is made. However, most often the functions are known at the managed code
>> compile time.
>>
>> Is P/Invoke still our only option?
>
> You could add an internal call that adds internal calls ;) Problem solved.
>
> Or resort to an internal p/invoke from the runtime itself:
>
> [DllImport("__Internal")
> static extern void mono_add_internal_call(string desc, IntPtr ftnptr);
>
> Robert
>
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
> 


More information about the Mono-devel-list mailing list