[Mono-dev] Proper way to construct objects with mono_runtime_invoke

Cameron Villers icefragment at gmail.com
Tue Aug 12 22:29:37 EDT 2008


Hello all,

I'm in the initial stages of embedding Mono into my application. I
have a C struct like so (simplified):

typedef struct
{
	float origin[3];
	const char *name;
} gentity_t;

I would like to be able to pass a pointer to an object of this type
(allocated globally on the stack) to my managed code constructor,
which will then store it for internal use:

class foo
{
    foo(gentity_t ent)
    {
        _ent = ent;
        // etc

The Mono docs state that the way to do this is to get a pointer to the
method and call mono_runtime_invoke (for brevity, I skip asserts on
obj, ctor, and the like, which all pass in my actual code):

MonoObject *obj;
obj = mono_object_new(domain, _class);    // already asserted _class
!= NULL by this point btw
mono_runtime_object_init(obj);
ctor = findClassMethod(_class, "foo (gentity_t ent)");
gentity_t testEnt;
// ...setup of testEnt...
gpointer args[1];
args[0] = testEnt;
mono_runtime_invoke(ctor, obj, args, NULL);

All this results in is a System.NullReferenceException upon trying to
access ent in the managed code. Have I missed something obvious in my
setup? I'm using 1.9.1 release (on amd64 Linux).

Thanks in advance for any help.

- Cameron


More information about the Mono-devel-list mailing list