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'2
or を掘って対応する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_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」型キャストでは成功しました。