2

如果我得到像 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'2orIDictionary(??)并寻找相应的.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”类型转换成功。

4

0 回答 0