#include "mono.hpp" #include namespace Mono { template <> MonoClass* getClass(){ return mono_get_sbyte_class(); } template <> MonoClass* getClass(){ return mono_get_byte_class(); } template <> MonoClass* getClass(){ return mono_get_int16_class(); } template <> MonoClass* getClass(){ return mono_get_uint16_class(); } template <> MonoClass* getClass(){ return mono_get_int32_class(); } template <> MonoClass* getClass(){ return mono_get_uint32_class(); } template <> MonoClass* getClass(){ return mono_get_int64_class(); } template <> MonoClass* getClass(){ return mono_get_uint64_class(); } template <> MonoClass* getClass(){ return mono_get_single_class(); } template <> MonoClass* getClass(){ return mono_get_double_class(); } template <> MonoClass* getClass(){ return mono_get_boolean_class(); } template <> MonoClass* getClass(){ return mono_get_char_class(); } template <> MonoClass* getClass(){ return mono_get_string_class(); } template <> MonoClass* getClass(){ return mono_get_object_class(); } template <> MonoClass* getClass(){ return mono_get_void_class(); } void getMethodSignatureTypes(MonoMethod* mono_method, MonoType** return_type, std::vector& argument_types) { auto signature = mono_method_signature(mono_method); void* iter = nullptr; *return_type = mono_signature_get_return_type(signature); MonoType* pt = nullptr; while( (pt = mono_signature_get_params(signature, &iter)) ){ argument_types.push_back(pt); } } MonoMethod* tryGetMonoMethod(MonoClass* target_class, const std::string& name, MonoClass* return_class, MonoClass* arg_classes[], size_t arg_classes_size) { if(target_class == nullptr) throw UsefulException("target_class is nullptr"); // iterate each method void* iter = nullptr; MonoMethod* m = nullptr; std::vector argument_types; while( (m = mono_class_get_methods(target_class, &iter)) ){ // compare name std::string m_name = mono_method_get_name(m); if(m_name != name) continue; argument_types.clear(); MonoType* return_type = nullptr; getMethodSignatureTypes(m, &return_type, argument_types); // compare argument count if(argument_types.size() != arg_classes_size) continue; // compare return type if(!mono_metadata_type_equal(return_type, mono_class_get_type(return_class))) continue; // compare argument types bool argument_types_mismatch = false; for(size_t i = 0; i < arg_classes_size; i++){ if(!mono_metadata_type_equal(argument_types[i], mono_class_get_type(arg_classes[i]))){ argument_types_mismatch = true; break; } } if(argument_types_mismatch) continue; // passed all tests successfully break; } return m; } }