Add methods to the SDK
This commit is contained in:
@@ -21,13 +21,13 @@ bool MonoLoader::Initialize(std::shared_ptr<spdlog::logger> log, const char* mon
|
||||
}
|
||||
logger->info("Mono DLL found at {:p}", (void*)mono);
|
||||
|
||||
g_mono_get_root_domain = (MonoDomain * (*)())GetProcAddress(mono, "mono_get_root_domain");
|
||||
g_mono_thread_attach = (void(*)(MonoDomain*))GetProcAddress(mono, "mono_thread_attach");
|
||||
g_mono_domain_assembly_open = (MonoAssembly * (*)(MonoDomain*, const char*))GetProcAddress(mono, "mono_domain_assembly_open");
|
||||
g_mono_assembly_get_image = (MonoImage * (*)(MonoAssembly*))GetProcAddress(mono, "mono_assembly_get_image");
|
||||
g_mono_class_from_name = (MonoClass * (*)(MonoImage*, const char*, const char*))GetProcAddress(mono, "mono_class_from_name");
|
||||
g_mono_class_get_method_from_name = (MonoMethod * (*)(MonoClass*, const char*, int))GetProcAddress(mono, "mono_class_get_method_from_name");
|
||||
g_mono_compile_method = (void* (*)(MonoMethod*))GetProcAddress(mono, "mono_compile_method");
|
||||
mono_get_root_domain = (MonoDomain * (*)())GetProcAddress(mono, "mono_get_root_domain");
|
||||
mono_thread_attach = (MonoThread * (*)(MonoDomain*))GetProcAddress(mono, "mono_thread_attach");
|
||||
mono_domain_assembly_open = (MonoAssembly * (*)(MonoDomain*, const char*))GetProcAddress(mono, "mono_domain_assembly_open");
|
||||
mono_assembly_get_image = (MonoImage * (*)(MonoAssembly*))GetProcAddress(mono, "mono_assembly_get_image");
|
||||
mono_class_from_name = (MonoClass * (*)(MonoImage*, const char*, const char*))GetProcAddress(mono, "mono_class_from_name");
|
||||
mono_class_get_method_from_name = (MonoMethod * (*)(MonoClass*, const char*, int))GetProcAddress(mono, "mono_class_get_method_from_name");
|
||||
mono_compile_method = (void* (*)(MonoMethod*))GetProcAddress(mono, "mono_compile_method");
|
||||
mono_assembly_foreach = (void(*)(void(*)(MonoAssembly*, void*), void*))GetProcAddress(mono, "mono_assembly_foreach");
|
||||
mono_assembly_get_name = (mono_assembly_get_name_t)GetProcAddress(mono, "mono_assembly_get_name");
|
||||
mono_assembly_name_get_name = (mono_assembly_name_get_name_t)GetProcAddress(mono, "mono_assembly_name_get_name");
|
||||
@@ -35,22 +35,28 @@ bool MonoLoader::Initialize(std::shared_ptr<spdlog::logger> log, const char* mon
|
||||
mono_method_get_name = (mono_method_get_name_t)GetProcAddress(mono, "mono_method_get_name");
|
||||
mono_method_signature = (mono_method_signature_t)GetProcAddress(mono, "mono_method_signature");
|
||||
mono_signature_get_param_count = (mono_signature_get_param_count_t)GetProcAddress(mono, "mono_signature_get_param_count");
|
||||
mono_class_get_field_from_name = (mono_class_get_field_from_name_t)GetProcAddress(mono, "mono_class_get_field_from_name");
|
||||
mono_runtime_invoke = (mono_runtime_invoke_t) GetProcAddress(mono, "mono_runtime_invoke");
|
||||
mono_field_get_offset = (mono_field_get_offset_t)GetProcAddress(mono, "mono_field_get_offset");
|
||||
mono_field_set_value = (mono_field_set_value_t)GetProcAddress(mono, "mono_field_set_value");
|
||||
mono_field_get_value = (mono_field_get_value_t)GetProcAddress(mono, "mono_field_get_value");
|
||||
|
||||
if (!g_mono_get_root_domain || !g_mono_thread_attach || !g_mono_domain_assembly_open ||
|
||||
!g_mono_assembly_get_image || !g_mono_class_from_name || !g_mono_class_get_method_from_name ||
|
||||
!g_mono_compile_method || !mono_assembly_foreach || !mono_assembly_get_name || !mono_assembly_name_get_name ||
|
||||
!mono_class_get_methods || !mono_method_get_name || !mono_method_signature || !mono_signature_get_param_count) {
|
||||
if (!mono_get_root_domain || !mono_thread_attach || !mono_domain_assembly_open || !mono_assembly_get_image ||
|
||||
!mono_class_from_name || !mono_class_get_method_from_name || !mono_compile_method || !mono_assembly_foreach ||
|
||||
!mono_assembly_get_name || !mono_assembly_name_get_name || !mono_class_get_methods || !mono_method_get_name ||
|
||||
!mono_method_signature || !mono_signature_get_param_count || !mono_class_get_field_from_name ||
|
||||
!mono_runtime_invoke || !mono_field_get_offset || !mono_field_set_value || !mono_field_get_value) {
|
||||
logger->error("Failed to resolve one or more Mono exports.");
|
||||
return false;
|
||||
}
|
||||
|
||||
g_monoDomain = g_mono_get_root_domain();
|
||||
g_monoDomain = mono_get_root_domain();
|
||||
if (!g_monoDomain) {
|
||||
logger->error("Mono root domain is null.");
|
||||
return false;
|
||||
}
|
||||
|
||||
g_mono_thread_attach(g_monoDomain);
|
||||
mono_thread_attach(g_monoDomain);
|
||||
logger->info("Attached to Mono domain {:p}", (void*)g_monoDomain);
|
||||
return true;
|
||||
}
|
||||
@@ -92,17 +98,44 @@ MonoClass* MonoLoader::FindClass(const std::string& assemblyName, const std::str
|
||||
MonoAssembly* assembly = FindAssembly(assemblyName);
|
||||
if (!assembly) return nullptr;
|
||||
|
||||
MonoImage* image = g_mono_assembly_get_image(assembly);
|
||||
MonoImage* image = mono_assembly_get_image(assembly);
|
||||
if (!image) return nullptr;
|
||||
|
||||
return g_mono_class_from_name(image, namespaceName.c_str(), className.c_str());
|
||||
return mono_class_from_name(image, namespaceName.c_str(), className.c_str());
|
||||
}
|
||||
|
||||
uint8_t* MonoLoader::GetCompiledMethod(MonoClass* monoClass, const std::string& methodName, int paramCount) {
|
||||
if (!monoClass) return nullptr;
|
||||
MonoMethod* method = g_mono_class_get_method_from_name(monoClass, methodName.c_str(), paramCount);
|
||||
MonoMethod* method = mono_class_get_method_from_name(monoClass, methodName.c_str(), paramCount);
|
||||
if (!method) return nullptr;
|
||||
return (uint8_t*)g_mono_compile_method(method);
|
||||
return (uint8_t*)mono_compile_method(method);
|
||||
}
|
||||
|
||||
MonoThread* MonoLoader::AttachCurrentThread() {
|
||||
MonoThread* monoThread = mono_thread_attach(mono_get_root_domain());
|
||||
if (!monoThread) return nullptr;
|
||||
return monoThread;
|
||||
}
|
||||
|
||||
void MonoLoader::DetachCurrentThread(MonoThread* thread) {
|
||||
if (!thread || !mono_thread_detach) return;
|
||||
mono_thread_detach(thread);
|
||||
}
|
||||
|
||||
MonoMethod* MonoLoader::GetMethod(MonoClass* monoClass, const std::string& methodName, int paramCount) {
|
||||
if (!monoClass) return nullptr;
|
||||
MonoMethod* method = mono_class_get_method_from_name(monoClass, methodName.c_str(), paramCount);
|
||||
if (!method) return nullptr;
|
||||
return method;
|
||||
}
|
||||
|
||||
MonoObject* MonoLoader::InvokeMethod(MonoMethod* method, MonoObject* obj, void** params, MonoObject** exception) {
|
||||
if (!method) return nullptr;
|
||||
MonoThread* thread = AttachCurrentThread();
|
||||
if (!thread) return nullptr;
|
||||
MonoObject* invoke = mono_runtime_invoke(method, obj, params, exception);
|
||||
DetachCurrentThread(thread);
|
||||
return invoke;
|
||||
}
|
||||
|
||||
void MonoLoader::DumpMethods(MonoClass* monoClass, std::shared_ptr<spdlog::logger> logger) {
|
||||
@@ -116,7 +149,7 @@ void MonoLoader::DumpMethods(MonoClass* monoClass, std::shared_ptr<spdlog::logge
|
||||
return;
|
||||
}
|
||||
|
||||
g_mono_thread_attach(g_monoDomain);
|
||||
mono_thread_attach(g_monoDomain);
|
||||
|
||||
if (!mono_class_get_methods || !mono_method_get_name || !mono_method_signature || !mono_signature_get_param_count) {
|
||||
logger->error("DumpMethods: Required Mono exports not resolved.");
|
||||
|
||||
Reference in New Issue
Block a user