#include #include #include #include #include #include #include #include #ifdef _MSC_VER # define EXPORT_FUNC extern __declspec(dllexport) #else # include # define EXPORT_FUNC #endif using namespace std; extern "C" { EXPORT_FUNC void PrintFunc(int val); } void error(const string &msg = "") { cerr << "Error:" << msg << endl; abort(); } int main(int argc, char* argv[]) { int retval; #ifndef _MSC_VER // Export Check void *ThisModule = dlopen(NULL, RTLD_LAZY); cout << "Module Handle:" << ThisModule << endl; void *pFunc = dlsym(ThisModule, "PrintFunc"); cout << "Function Handle:" << pFunc << endl; if(!pFunc) error("No symbol: PrintFunc"); // mono_set_dirs("./monolib","./monoetc"); #else mono_set_dirs(".\\monolib",".\\monoetc"); #endif MonoDomain *domain; if (argc < 3){ fprintf (stderr, "Please provide an assembly to load\n"); return 1; } string cmd = argv[1]; string file = argv[2]; mono_config_parse(NULL); domain = mono_jit_init("monotest"); if(cmd == "lib") { MonoAssembly *assembly = mono_domain_assembly_open (domain, file.c_str()); if (!assembly) error("No such assembly"); PrintFunc(0); MonoImage *image = mono_assembly_get_image(assembly); MonoClass *klass = mono_class_from_name(image, "TestNamespace", "TestClass"); MonoMethodDesc *desc = mono_method_desc_new(":TestStaticMethod(int)", false); MonoMethod *static_method = mono_method_desc_search_in_class (desc, klass); void *args[1]; int val1 = 1234; args[0] = &val1; mono_runtime_invoke (static_method, NULL, args, NULL); } else { MonoAssembly *assembly = mono_domain_assembly_open (domain, file.c_str()); retval = mono_jit_exec (domain, assembly, argc - 1, argv + 1); } mono_jit_cleanup(domain); return retval; } void PrintFunc(int val) { cout << "In PrintFunc :" << val << endl; }