Mercurial > hg > vboxdotnet
diff VBoxFrontend/VBoxMono.c @ 2:f1deea9c97a0
Cleaned up the interop code generator, added wrapper application to initialize kernel driver and run mono
author | Ivo Smits |
---|---|
date | Wed, 04 May 2011 16:10:08 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VBoxFrontend/VBoxMono.c Wed May 04 16:10:08 2011 +0200 @@ -0,0 +1,62 @@ +/* To compile, you may have to specify: + * The include paths for mono: -I /usr/include/mono-1.0/ -I /usr/include/glib-2.0/ -I /usr/lib/glib-2.0/include/ + * The location of the VBoxXPCOMC.so library: /usr/lib/virtualbox/VBoxXPCOMC.so + * The location of the mono library (if an alternative build is to be used): /home/ivo/mono/devtest/lib/libmono-2.0.so + * To link against the mono library (if the system wide installed version is to be used): -lmono + * Where to look for the VBoxXPCOMC.so library at run time: -Wl,-R,/usr/lib/virtualbox + * Where to look for the mono library at run time (if non-standard): -R,/home/ivo/mono/devtest/lib/ + * + * The resulting commandline may look like this: + gcc VBoxMono.c -o VBoxMono -lmono \ + -I /usr/include/mono-1.0/ -I /usr/include/glib-2.0/ -I /usr/lib/glib-2.0/include/ \ + /usr/lib/virtualbox/VBoxXPCOMC.so -Wl,-R,/usr/lib/virtualbox + * The resulting commandline may look like this if mono is installed in an alternative location: + gcc VBoxMono.c -o VBoxMono \ + -I /usr/include/mono-1.0/ -I /usr/include/glib-2.0/ -I /usr/lib/glib-2.0/include/ \ + /usr/lib/virtualbox/VBoxXPCOMC.so -Wl,-R,/usr/lib/virtualbox \ + /home/ivo/mono/devtest/lib/libmono-2.0.so -Wl,-R,/home/ivo/mono/devtest/lib/ + * Then make the binary owned by root and set the suid bit: + sudo chown root VBoxMono + sudo chmod u+s VBoxMono +*/ + +#include <unistd.h> +#include <stdio.h> +#include <stdlib.h> +#include <mono/jit/jit.h> +#include <mono/metadata/assembly.h> +#include <mono/metadata/mono-config.h> + +extern int RTR3InitAndSUPLib(); + +int main(int argc, char *argv[]) { + if (argc < 2) { + fprintf(stderr, "VBoxMono: Usage: %s assembly.exe\n", argv[0]); + return 1; + } + int rc = RTR3InitAndSUPLib(); + if (rc != 0) { + fprintf(stderr, "VBoxMono: Could not initialize VirtualBox driver (%d)\n", rc); + return rc; + } + int gid = getuid(); + if (gid != getegid()) setregid(gid, gid); + int uid = getuid(); + if (uid != geteuid()) setreuid(uid, uid); + mono_config_parse(NULL); + //mono_set_dirs("/home/ivo/mono/devtest/lib", "/etc"); + MonoDomain *domain = mono_jit_init_version("VirtualBox", "v2.0.50727"); + if (!domain) { + fprintf(stderr, "VBoxMono: Could not create application domain\n"); + return 1; + } + MonoAssembly *assembly = mono_domain_assembly_open(domain, argv[1]); + if (!assembly) { + fprintf(stderr, "VBoxMono: Could not load assembly %s\n", argv[1]); + mono_jit_cleanup(domain); + return 1; + } + int ret = mono_jit_exec(domain, assembly, argc - 1, argv + 1); + mono_jit_cleanup(domain); + return ret; +}