Dynamic binding to the Mono runtime API

Jakub Szewczyk via Digitalmars-d-announce digitalmars-d-announce at puremagic.com
Sun Jun 4 01:18:36 PDT 2017


On Sunday, 4 June 2017 at 05:47:32 UTC, Adam Wilson wrote:
> On 6/3/17 10:30, Jakub Szewczyk wrote:
>> ...
>
> I work with C# professionally and this is some SERIOUSLY cool 
> work. Thank you for this!

Thank you all!

>
> I've looked over the code a bit and I have a couple of 
> questions.
> This appears to be an interface to the runtime itself, not a 
> BCL interface correct?
> It looks like this could be used to could this be used to read 
> into a Mono Class Libraries, and if so would so some sort of 
> automated code generation tool be required? It looks to me like 
> the binding will be non-trivial, with GC, exceptions, etc. that 
> all need to be handled at the call-site.
> Can we get a static library version of this, or is there a 
> dependency on dynamic libraries?
>
> I have to admit I am very impressed. I have spent a lot of time 
> building code generators before and I have to admit that the 
> idea of binding to arbitrary .NET libraries via code generation 
> is extremely appealing to me. I am seriously tempted to take 
> this and start building a binding generator...
>
> I seriously need more free time! Way too many cool and useful 
> things happening in D for my limited free time. A D binding for 
> XAML ... THAT would sight to behold!

This is an interface to the Mono libraries, D/CLI would require 
quite a lot of compiler changes, both on the front-end and 
back-end side, but thanks to metaprogramming a wrapper library 
can get very close to such an interface.
I plan on making an automated D to Mono bridge, akin to LuaD, so 
that it can be used as a scripting platform for e.g. games. I 
haven't thought about doing it the other way around, but now it 
seems like a very interesting idea! Unfortunately no XAML 
(http://www.mono-project.com/docs/gui/wpf/), but many other 
libraries, such as XWT (https://github.com/mono/xwt) could be 
ported this way, I'll certainly look into it.

Mono actually supports some kind of GC bridging as far as I 
understand, as there is a sgen-bridge.h header just for that, and 
it has apparently been used in the C#-Java Xamarin interace on 
Android. As for exceptions - D functions have to be wrapped in a 
nothrow wrapper, but that can be completely automated with 
templates. The other way around is also quite simple - when 
invoking a Mono function a pointer can be given that will set an 
exception reference if one is thrown from the .NET side, and a 
wrapper can easily rethrow it back to D.

I can make a static library version, it's just some regex 
substitutions done on the functions file actually, most probably 
I'll publish it today. It will be a dub subconfiguration like it 
is the case for GLFW3. Btw, I've manually ported the basic and 
configuration headers, so that no mistakes are made, and then 
used DStep and a modified DStep to generate the rest of the 
headers - my modification was only to change the way function 
declarations are generated, to make them in derelict form of 
alias da_function = void function(...);, and the rest was done 
with quite a lot of editor(VSCode) shortcuts.


More information about the Digitalmars-d-announce mailing list