Pass array to C# from C++ via mono -
i need pass array c++ c# using mono. can't mono_array_set() compile. how can pass array c++ c#?
i've tried mono_runtime_invoke() compiles gives runtime error.
mcs /nologo /warn:4 /debug:pdbonly /o /nowarn:3003 /platform:x64 /out:array.dll /target:library array.cs g++ array.cpp -g3 `pkg-config --cflags --libs mono-2` -o array <snip> array.cpp:32:5: note: in expansion of macro ‘mono_array_set’
// array.cpp #include <mono/jit/jit.h> #include <mono/metadata/assembly.h> #include <mono/metadata/debug-helpers.h> int main(int argc, char* argv[]) { monodomain* domain = mono_jit_init("./array.dll");; monoassembly* assembly = mono_domain_assembly_open(domain, "./array.dll"); monoimage* image = mono_assembly_get_image(assembly); monoclass* containsclass = mono_class_from_name(image, "intarray", "containsanint"); monomethoddesc* containsdesc = mono_method_desc_new("intarray.containsanint:.ctor(int)", false); monomethod* containsctor = mono_method_desc_search_in_class(containsdesc, containsclass); monoobject* containsobject = mono_object_new(domain, containsclass); void* args[1]; int value = 7; args[0] = &value; monoobject* exception = null; mono_runtime_invoke(containsctor, containsobject, args, &exception); monoclass* unpackageclass = mono_class_from_name(image, "intarray", "unpackage"); args[0] = containsobject; monomethoddesc* returnintdesc = mono_method_desc_new("intarray.unpackage:returnint(intarray.containsanint)", true); monomethod* returnintmethod = mono_method_desc_search_in_class(returnintdesc, unpackageclass); mono_runtime_invoke(returnintmethod, null, args, &exception); // <--- expected, outputs "in returnint: 7" monoarray* thearray = mono_array_new(domain, containsclass, 1); //// following not compile mono_array_set(thearray, monoclass*, 0, containsobject); //// monomethoddesc* returnelementdesc = mono_method_desc_new("intarray.unpackage:returnelement(intarray.containsanint[])", true); monomethod* returnelementmethod = mono_method_desc_search_in_class(returnelementdesc, unpackageclass); mono_runtime_invoke_array(returnelementmethod, null, thearray, &exception); // <--- should output "in returnelement: 7" mono_jit_cleanup(domain); }
// array.cs using system; using system.io; namespace intarray { public class containsanint { public containsanint(int i) { intvalue = i; } public int intvalue { get; set; } } public class unpackage { public static int returnint(containsanint n) { console.writeline("in returnint: " + n.intvalue); return n.intvalue; } public static int returnelement(containsanint[] n) { console.writeline("in returnelement: " + n[0].intvalue); return n[0].intvalue; } } }
this works:
monoarray* thearray = mono_array_new(domain, containsclass, 1); mono_array_set(thearray, monoobject*, 0, containsobject); args[0] = thearray; mono_runtime_invoke(returnelementmethod, null, args, &exception); // <--- expected, outputs "in returnelement: 7"
Comments
Post a Comment