一、MonoObject对象
实例化:
MonoClass * classStudent = mono_class_from_name(image, "MonoCSharp", "Student");
MonoObject * objStudent = mono_object_new(domain, classStudent);
实例化详解:
创建对象涉及两个单独的操作:分配内存和调用构造函数。
/* we usually get the class we need during initialization */
/* 通常在初始化过程中获取类。*/
MonoImage *image = mono_assembly_get_image (assembly);
MonoClass *my_class = mono_class_from_name (image, "MyNamespace", "MyClass");
...
/* allocate memory for the object */
/* 为对象分配内存。*/
MonoObject *my_class_instance = mono_object_new (domain, my_class);
/* execute the default argument-less constructor */
/* 调用默认无参构造函数。*/
mono_runtime_object_init (my_class_instance);
对于更复杂的构造函数,或者如果您希望更好地控制构造函数的执行,可以在获取表示构造函数的 MonoMethod* 后调用:
mono_runtime_invoke()
(mono_runtime_object_init()是mono_runtime_invoke()封装?)
/* execute my_class_instance = new MyClass ("Mono rocks"); */
MonoObject *my_class_instance = mono_object_new (domain, my_class);
void *args [1];
args [0] = mono_string_new (domain, "Mono rocks");
/* constructor methods return void, so we ignore the return value,
* the constructed object is my_class_instance.
*/
mono_runtime_invoke (ctor_method, my_class_instance, args, NULL);
获取/设置字段(反射):
反射获取设置单个属性:
MonoClass * classStudent = mono_class_from_name(image, "MonoCSharp", "Student");
MonoObject * objStudent = mono_object_new(domain, classStudent);
MonoClassField * fieldStudentId = mono_class_get_field_from_name(classStudent, "id");
//设置字段值。
int value_set = 233;
mono_field_set_value(objStudent, fieldStudentId, &value_set);
//获取字段值。
int value_get;
mono_field_get_value(objStudent, fieldStudentId, &value_get);
反射获取设置对象所有属性:
MonoClassField * field = NULL;
void * itor = NULL;
while (field = mono_class_get_fields(monoclassCurrent, &itor))
{
const char * field_name = mono_field_get_name(field);
MonoType * type = mono_field_get_type(field);
MonoTypeEnum typeEnum = static_cast<MonoTypeEnum> (mono_type_get_type(type));
switch (typeEnum)
{
case MONO_TYPE_OBJECT:
//...
break;
//...
default:
break;
}
}
补充:C#端创建对象
-
知乎文章有new操作符的实现。原理比较复杂。
-
简单的实现方法:在构造函数中调用C++函数返回句柄。(Creedon)
二、MonoArray对象
※对应C#的数组对象Type[]
。
示例:
MonoArray* array = mono_array_new(domain, monoclassGameObject, size);
for (size_t i = 0; i < size; i++)
{
MonoObject * obj = mono_object_new(domain, monoclassGameObject);
//mono_runtime_object_init(obj);
void* handle = mainScene.gameObjects[i];
mono_field_set_value(obj, monofieldGameObjectHandle, &handle);
mono_array_set(array, MonoObject *, i, obj);
}
其他函数:
mono_array_new
mono_array_new_full
mono_array_new_specific
其他方法:
三、MonoString对象
※对应C#字符串。
创建MonoString对象:
const char * str = gameObject->name;
MonoString * monostr = mono_string_new(domain, str);
其他函数:
mono_string_new
mono_string_new_len
mono_string_new_wrapper
mono_string-new_utf16
从MonoString提取:
const char * str = mono_string_to_utf8(monostr);
其他函数:
mono_string_to_utf8
mono_string_to_utf16