zhouqijie

一、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#端创建对象

二、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