C ++からCLRクラスのメソッドを呼び出せるようにしたい。特に、いくつかのクラスにはオーバーロードされたメソッドが含まれている可能性があるので、メソッド名とパラメータの署名の両方に基づいてクラスのメソッドを検索する必要があります。
私はこのような関数を持っています:
MonoMethod* find_method (
MonoDomain* domain,
MonoClass* type,
const char* name,
int nargs,
MonoClass** types)
私はクラスのメンバーを繰り返し、名前で一致するメンバーを見つける。次に、メソッドのパラメーターをチェックして、それらがこの関数のtypesパラメーターで必要なリストと一致するかどうかを確認する必要があります。
mono_signature_get_params()
is then used to iterate over the parameters for each method with a matching name.
Questions: How can I do the following:
MonoClass*
constants for fundamental types int32_class, int64_class
, etc.
MonoType *またはMonoClass *のフィールドにアクセスするときと同じようにコンパイルしない2つの補助関数を次に示します。コンパイラは、2つの構造が不完全であることを示す文句を言います。
//
// Detetermine whether classes A and B are equivalent
//
static bool IsEquivalent (MonoType* typeA, MonoType* typeB)
{
MonoTypeEnum Ta = typeA->type;
MonoTypeEnum Tb = typeB->type;
//if basic type not a match, can punt
if (Ta != Tb)
return false;
//if simple type, nothing further to check
if (Ta < MONO_TYPE_PTR)
return true;
//check class
if (Ta == MONO_TYPE_CLASS)
return typeA->data.klass = typeB->data.klass;
else
return typeA->data.klass = typeB->data.klass;
}
//
// Determine whether parameters in signature match incoming parameters
//
static bool types_match (
MonoMethodSignature* sig,
MonoClass** types,
int nargs)
{
void* iter = NULL;
MonoType* type = NULL;
int i = 0;
while (type = mono_signature_get_params (sig, &iter))
{
if (!IsEquivalent (type, types[i++]->this_arg))
return false;
}
return true;
}
非公開のモノラルヘッダーは含めないでください。内部を変更するとアプリケーションが壊れます。
MonoType *から型enum値にアクセスするには、(metadata/metadata.hから)mono_type_get_type()関数を呼び出す必要があります。 MONO_TYPE_CLASSとMONO_TYPE_VALUETYPEについては、mono_type_get_class()でMonoClass *値にアクセスできます。
MonoClass *を使用して引数の型を表すことは、たとえば参照渡しの引数を表すことができないため、基本的には間違っていることに注意してください。
代入可能で一致させる必要がある場合は、mono_class_is_assignable_from()を使用できますが、byref引数を処理し、enum型がその基礎となる整数型に自動変換できるようにするかどうかを決定する必要があることに注意してください。
基本的な型クラスは以下のような関数で簡単に取り出すことができます: mono_get_int32_class()、mono_get_boolean_class()など