// $Id$ #include "NGMonoAssembly.h" #include "NGMonoDomain.h" #include "common.h" @implementation NGMonoAssembly static MonoAssembly * assemblyWillLoad(MonoAssemblyName *aname, gchar **assemblies_path, gpointer user_data) { printf("mono will load assembly '%s' (culture=%s) ...\n", aname->name, aname->culture); return NULL; } static void assemblyDidLoad(MonoAssembly *assembly, gpointer userData) { printf("mono did load assembly: 0x%08X\n", assembly); } + (void)initialize { static BOOL didInit = NO; if (!didInit) { didInit = YES; mono_install_assembly_load_hook(assemblyDidLoad, self); mono_install_assembly_preload_hook(assemblyWillLoad, self); } } - (id)initWithContentsOfFile:(NSString *)_path inDomain:(NGMonoDomain *)_dom { if ((self = [super init])) { self->path = [_path copy]; self->domain = [_dom retain]; self->handle = mono_domain_assembly_open([_dom handle], [_path cString]); if (self->handle == NULL) { [self release]; return nil; } } return self; } - (void)dealloc { if (self->handle) mono_assembly_close(self->handle); [self->domain release]; [self->path release]; [super dealloc]; } /* accessors */ - (void *)handle { return self->handle; } - (void *)imageHandle { return ((MonoAssembly *)self->handle)->image; } /* operations */ - (int)executeMain:(NSArray *)_args { int retval; char **argv; unsigned i, argc; argc = [_args count]; argv = calloc(argc + 1, sizeof(char *)); for (i = 0; i < argc; i++) argv[i] = strdup([[_args objectAtIndex:i] UTF8String]); argv[i] = NULL; retval = mono_jit_exec([self->domain handle], [self handle], argc, argv); for (i = 0; i < argc; i++) { if (argv[i]) free(argv[i]); } free(argv); return retval; } @end /* NGMonoAssembly */