如果我得到类似System.String的经典类型,那就没问题了。
clsString = mono_class_from_name(image_mscorlib, "System", "String");
但是当我尝试像Dictionary这样的基于模板的类时,它会失败:
clsDictionary2 = mono_class_from_name(image_mscorlib, "System.Collections.Generic", "Dictionary"); NULL!!
clsDictionary3 = mono_class_from_name(image_mscorlib, "System.Collections.Generic", "Dictionary<TKey,TValue>"); also NULL
如何使用C ++单声道包装器代码获取Mono Dictionary类。我查看了MONO库,发现里面有Dictionary'2类型,我可以得到它:
clsDictionary1 = mono_class_from_name(image_mscorlib, "System.Collections.Generic", "Dictionary`2"); not NULL, pointer
但是如何实例化Dictionary(int, int)
或Dictionary(object, object)
?我应该挖掘Dictionary'2
或IDictionary(??)
并寻找相应的.ctor(int, int)
或(object, object)
是否正确?
对于那些对这个问题也感兴趣的人来说只是一个简短的更新(obj_Instance - 一个指向某个.NET对象的指针,它封装了PFILED成员obj - Dictionary&lt;,&gt; ptr_DictObj):
ptr_DictObj = mono_field_get_value_object(pDomain, pfield, obj_Instance);
char* cls = (char*)mono_object_get_class((void*)ptr_DictObj);
char* name1 = (char*)((char*)cls + 0x30);
char* namesp1 = (char*)((char*)cls + 0x34);
Log("name1=", name1);
Log("namespace1=", namesp1);
答案是name1=Dictionary'2, namespace1=System.Collections.Generic
。
所以它真的是Dictionary'2
类,但我仍然无法将ptr_DictObj
投射到System.Collections.Generic.Dictionary'2
。 mono_object_castclass_mbyref
突然崩溃导致我所有的梦想继续下去=)))
void* obj_Dictionary = mono_object_castclass_mbyref(ptr_DictObj, clsDictionary);
刚刚找到了崩溃的原因。
clsDictionary = mono_class_from_name(mono_get_corlib(), "System.Collections.Generic", "Dictionary`2");
clsDictionary
与运行时获得的“cls”不同。当我尝试将ptr_DictObj
转换为clsDictionary
时,它失败了,但是成功进行了“cls”类型转换。