/* * mono.h -- Definitions for Mono C API functions. * * The file contains definitions for some of functions provided by Mono C API. * * Note: Since we don't use any mono headers, all pointers to mono-related structs are * replaced with void *. */ #pragma once #pragma warning( disable : 4152 ) #include // Creates a MonoString based from a C wide string #define MONO_STRING(str) mono_string_new_utf16(domain, str, wcslen(str)) // Set MonoArray's index to a reference type value (i.e. string) #define SET_ARRAY_REF(arr, index, refVal) \ { \ void **p = (void**) mono_array_addr_with_size(arr, sizeof(void*), index); \ mono_gc_wbarrier_set_arrayref(arr, p, refVal); \ } // Here we define the pointers to some functions within mono.dll // Note to C learners: these are not signature definitions, but rather "variable" // definitions with the function pointer type. // Note: we use void* instead of the real intented structs defined in mono API // This way we don't need to include or define any of Mono's structs, which saves space // This, obviously, comes with a drawback of not being able to easily access the contents of the structs typedef enum { MONO_DEBUG_FORMAT_NONE, MONO_DEBUG_FORMAT_MONO, /* Deprecated, the mdb debugger is not longer supported. */ MONO_DEBUG_FORMAT_DEBUGGER } MonoDebugFormat; void (*mono_jit_parse_options)(int argc, char * argv[]); void (*mono_debug_init)(MonoDebugFormat format); void (*mono_debug_domain_create)(void*); void *(*mono_jit_init_version)(const char *root_domain_name, const char *runtime_version); void *(*mono_domain_assembly_open)(void *domain, const char *name); void *(*mono_assembly_get_image)(void *assembly); void *(*mono_runtime_invoke)(void *method, void *obj, void **params, void **exc); void *(*mono_method_desc_new)(const char *name, int include_namespace); void *(*mono_method_desc_search_in_image)(void *desc, void *image); void *(*mono_method_signature)(void *method); UINT32 (*mono_signature_get_param_count)(void *sig); void *(*mono_array_new)(void *domain, void *eclass, uintptr_t n); void (*mono_gc_wbarrier_set_arrayref)(void *arr, void *slot_ptr, void *value); char *(*mono_array_addr_with_size)(void *arr, int size, uintptr_t idx); void *(*mono_get_string_class)(); void *(*mono_string_new_utf16)(void *domain, const wchar_t *text, INT32 len); void* (*mono_object_to_string)(void* obj, void** exc); void (*mono_dllmap_insert)(void* assemblyImage, const char* dll, const char* func, const char* tdll, const char* tfunc); char* (*mono_string_to_utf8)(void* str); wchar_t* (*mono_string_to_utf16)(void* str); void (*mono_free)(void*); /* Installs a function which is called when the runtime encounters an unhandled exception. * This hook isn't expected to return. * If no hook has been installed, the runtime will print a message before aborting. */ typedef void (*MonoUnhandledExceptionFunc)(void* exc, void* user_data); void (*mono_install_unhandled_exception_hook)(MonoUnhandledExceptionFunc func, void* user_data); /** * \brief Loads Mono C API function pointers so that the above definitions can be called. * \param monoLib Mono.dll module. */ inline void loadMonoFunctions(HMODULE monoLib) { // Enjoy the fact that C allows such sloppy casting // In C++ you would have to cast to the precise function pointer type #define GET_MONO_PROC(name) name = (void*)GetProcAddress(monoLib, #name) // Find and assign all our functions that we are going to use GET_MONO_PROC(mono_debug_domain_create); GET_MONO_PROC(mono_domain_assembly_open); GET_MONO_PROC(mono_assembly_get_image); GET_MONO_PROC(mono_runtime_invoke); GET_MONO_PROC(mono_debug_init); GET_MONO_PROC(mono_jit_init_version); GET_MONO_PROC(mono_jit_parse_options); GET_MONO_PROC(mono_method_desc_new); GET_MONO_PROC(mono_method_desc_search_in_image); GET_MONO_PROC(mono_method_signature); GET_MONO_PROC(mono_signature_get_param_count); GET_MONO_PROC(mono_array_new); GET_MONO_PROC(mono_get_string_class); GET_MONO_PROC(mono_string_new_utf16); GET_MONO_PROC(mono_gc_wbarrier_set_arrayref); GET_MONO_PROC(mono_array_addr_with_size); GET_MONO_PROC(mono_object_to_string); GET_MONO_PROC(mono_string_to_utf8); GET_MONO_PROC(mono_string_to_utf16); GET_MONO_PROC(mono_free); GET_MONO_PROC(mono_dllmap_insert); GET_MONO_PROC(mono_install_unhandled_exception_hook); }