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 ラッパー コードで 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'2or を掘って対応するorIDictionary(??)を探すのは正しいです.ctor(int, int)(object, object)?


この質問にも興味がある人のための簡単な更新 (obj_Instance - PFILED メンバー obj をカプセル化する .NET オブジェクトへのポインター - Dictionary<,> 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_DictObjSystem.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