views:

512

answers:

3

Does anyone know the specifics of how to embed the Mono runtime in a Delphi Win32 application? The official documentations is not very helpful with regards to the Win32 environment (www.mono-project.com/Embedding_Mono).

Upate:

I am very familiar with the vagaries of static linking in Delphi and would be perfectly happy with a DLL. Mono itself has dependencies so one more DLL is really no big deal. The comment about FPU control word is one of my concerns since I believe the CG default settings are different than Microsoft tools. Here is what I believe is needed:

  • Header translation from "C" to Delphi (probably not too hard)
  • Compilation of the Mono DLL (is the one shipped with Mono usable?)
  • A better understanding of FPU control word goctha's (hopefully none)
  • Some feedback from someone that has the battle scars from having tried this stunt ;)
+2  A: 

This article by Rudy Velthuis shows an example how to link a C lib to Delphi. With a bit of work it should be possible to access mono_jit_init from Delphi using this technique.

Stijn Sanders
Mono is LGPL, so static linking on Windows requires getting a commercial license from Novell, as stated in http://www.mono-project.com/Scripting_With_Mono (search for "Licensing").
mghie
Are you sure you read that correctly? I understand you need a commercial license if you want to embed mono *and* want to deny access to the mono bit of your application to avoid tinkering.
Stijn Sanders
The linked article is concerned with statically linking C libraries to Delphi code. Linking Mono in this way would break the license, as you can no longer replace it with a more recent version. LGPL is exactly there to protect the users' right to "tinker", so to speak. If OTOH mono.dll is to be used, then the standard ways of consuming DLLs would apply, and the info in the Velthuis article won't really help with that.
mghie
I have seen Rudy's article and also done similar work in the past with LibTiff. Was not much fun so I will settle for the DLL approach.
David Taylor
@mghie - You can statically link LGPL code as long as you also provide your original object files so that the end user can replace the LGPL portion and relink.
Iceman
Yes, that's true, I forgot about this possibility.
mghie
+2  A: 

You might want to take a look at http://www.remobjects.com/hydra.aspx.

Ertugrul Tamer Kara
I have Hydra, but it does not really address what I am trying to accomplish. Namely be able to embed a .Net runtime and provide tight native integration with Delphi. Hydra is a nice tool BTW.
David Taylor
+5  A: 

Mono seems to be buildable with mingw, allthough most references I found crosscompiled from Linux, e.g. http://www.mono-project.com/Cross-compiling_Mono_for_Windows

I'd say your first priority is searching for a libmono dll that

  • doesn't use cygwin (trust me)
  • is known to work, also outside mingw (avoid possible mingw specific C++ mangling if C++ is used)
  • Preferably comes with a readable header.

If you find or build it as DLL (to satisfy mghie's correct remark), write a header (like Stijn suggests) it could work.

It won't be trivial though, VMs are not exactly trivial beasts, and expect problems in the usual cross-language problem domains: library initialization (order), FPU exception mask and exception handling in general. Partially that is also why I said "know to work outside of mingw", studying how it is interfaced in other compilers might give pointers how to properly tackle this.

Note that the mono tutorial has a mono lib initializer, but that doesn't mean that all the libs that mono uses are properly initialized. Specially mingw's libc might need initialization, since they are normally initialized via ctors. My (very initial) mingw glue code is here:

http://svn.freepascal.org/cgi-bin/viewvc.cgi/trunk/ide/fpmingw.pas?view=markup

On the other hand, in a DLL it might be initialized via a DLL initialization routine.

I myself have been able to build GDB as a lib and use it (statically in FPC though, I didn't have the motivation to make a DLL since that was an option)

Note that if you really have to do this yourself this is NOT an easy way.

Marco van de Voort
I don't know if it helps or not, but the Mono runtime is also buildable by Visual Studio 2008. The solution files are in /mono/msvc.
jpobst
I think for the DLL route that would be better, which is the only way for Delphi. (well theoretically, statically when built with BCB could also work)
Marco van de Voort