如果我得到像 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)
or Dictionary(object, object)
?我应该挖掘Dictionary'2
orIDictionary(??)
并寻找相应的.ctor(int, int)
or是否正确(object, object)
?
对于那些也对这个问题感兴趣的人来说只是一个简短的更新(obj_Instance - 一个指向封装 PFILED 成员 obj - Dictionary<,> ptr_DictObj 的一些 .NET 对象的指针):
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”类型转换成功。