[Mono-dev] Crash running C code built on OS X El Capitan in Xcode 7

Jonathan Mitchell jonathan at mugginsoft.com
Mon Nov 2 14:37:50 UTC 2015


The following C test code calls the current Mono 4.2.1-91 framework.
It builds and runs fine within Xcode 6.4 on 10.10.

It fails if I build and run it on OS X 10.11 using Xcode 7.1 - EXC_BAD_ACCESS in mono_jit_runtime_invoke() when calling AssemblyName:GetName()
However the built binary runs fine outside of the Xcode environment.

This obviously makes life difficult.
It seems logical to infer that the Xcode IDE is the issue here and I have posted to the Xcode list.

However, maybe there is more to this than I can detect.
Perhaps the code below is somehow suspect.
Any comments would be appreciated.

Jonathan

// Link against both Mono and CoreFoundation.
// Header search path set to /Library/Frameworks/Mono.framework/Headers/Mono-2.0
// Architecture i386.
#include <stdio.h>
#import <mono/jit/jit.h>
#import <mono/metadata/metadata.h>
#import <mono/metadata/debug-helpers.h>

MonoObject *invokeName(MonoObject *object, char *name);

int main(int argc, const char * argv[]) {

   // init
   MonoDomain *domain = mono_jit_init_version("Dubrovnik", "v4.0.30319");
   MonoAssembly *assembly = mono_domain_assembly_open(domain, "mscorlib");

   // returns System.Reflection.Assembly
   MonoReflectionAssembly *assemblyObject = mono_assembly_get_object(domain, assembly);

   // returns System.Reflection.AssemblyName
   MonoObject *assemblyNameObject = invokeName((MonoObject *)assemblyObject, ":GetName()");

   // returns System.Version
   MonoObject *versionObject = invokeName(assemblyNameObject, ":get_Version()");

   // Returns System.String
   MonoObject *stringObject = invokeName(versionObject, ":ToString()");
   printf("Version : %s\n", mono_string_to_utf8((MonoString *)stringObject));

   return 0;
}

MonoObject *invokeName(MonoObject *object, char *name)
{
   MonoClass *klass = mono_object_get_class(object);

   MonoMethodDesc *methodDesc = mono_method_desc_new(name, 1);
   MonoMethod *meth = NULL;
   while (klass != NULL) {
       meth = mono_method_desc_search_in_class(methodDesc, klass);
       if(meth != NULL) {
           meth = mono_object_get_virtual_method(object, meth);
           break;
       }
       klass = mono_class_get_parent(klass);
   }
   MonoObject *monoException = NULL;
   MonoObject *resultObject = mono_runtime_invoke(meth, object, NULL, &monoException);

   klass = mono_object_get_class(resultObject);
   printf("invokeName returned : %s\n", mono_class_get_name(klass));

   return resultObject;
}














_______________________________________________
Do not post admin requests to the list. They will be ignored.
Xcode-users mailing list      (Xcode-users at lists.apple.com)
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/xcode-users/jonathan%40mugginsoft.com

This email sent to jonathan at mugginsoft.com


More information about the Mono-devel-list mailing list