} return FX_S_OK; } std::vector<guid_t> MonoGetImplementedClasses(const guid_t& iid) { MonoEnsureThreadAttached(); void* args[1]; args[0] = (char*)&iid; MonoObject* exc = nullptr; MonoArray* retval = (MonoArray*)mono_runtime_invoke(g_getImplementsMethod, nullptr, args, &exc); if (exc) { return std::vector<guid_t>(); } guid_t* retvalStart = mono_array_addr(retval, guid_t, 0); uintptr_t retvalLength = mono_array_length(retval); return std::vector<guid_t>(retvalStart, retvalStart + retvalLength); } static InitFunction initFunction([] () { InitMono(); });
void CPipeServer::Start(void) { BYTE command; while (TRUE) { CreatePipeandWaitForconnect(); try { while (TRUE) { command=ReadByte(); switch(command) { case MONOCMD_INITMONO: InitMono(); break; case MONOCMD_OBJECT_GETCLASS: Object_GetClass(); break; case MONOCMD_ENUMDOMAINS: EnumDomains(); break; case MONOCMD_SETCURRENTDOMAIN: SetCurrentDomain(); break; case MONOCMD_ENUMASSEMBLIES: EnumAssemblies(); break; case MONOCMD_GETIMAGEFROMASSEMBLY: GetImageFromAssembly(); break; case MONOCMD_GETIMAGENAME: GetImageName(); break; case MONOCMD_ENUMCLASSESINIMAGE: EnumClassesInImage(); break; case MONOCMD_ENUMFIELDSINCLASS: EnumFieldsInClass(); break; case MONOCMD_ENUMMETHODSINCLASS: EnumMethodsInClass(); break; case MONOCMD_COMPILEMETHOD: CompileMethod(); break; case MONOCMD_GETMETHODHEADER: GetMethodHeader(); break; case MONOCMD_GETMETHODHEADER_CODE: GetILCode(); break; case MONOCMD_LOOKUPRVA: RvaMap(); break; case MONOCMD_GETJITINFO: GetJitInfo(); break; case MONOCMD_FINDCLASS: FindClass(); break; case MONOCMD_FINDMETHOD: FindMethod(); break; case MONOCMD_GETMETHODNAME: GetMethodName(); break; case MONOCMD_GETMETHODCLASS: GetMethodClass(); break; case MONOCMD_GETCLASSNAME: GetKlassName(); break; case MONOCMD_GETCLASSNAMESPACE: GetClassNamespace(); break; case MONOCMD_FREEMETHOD: FreeMethod(); break; case MONOCMD_TERMINATE: return; case MONOCMD_DISASSEMBLE: DisassembleMethod(); break; case MONOCMD_GETMETHODSIGNATURE: GetMethodSignature(); break; case MONOCMD_GETPARENTCLASS: GetParentClass(); break; case MONOCMD_GETSTATICFIELDADDRESSFROMCLASS: GetStaticFieldAddressFromClass(); break; } } } catch (char *e) { //Pipe error, or something else that wasn't caught. Exit the connection and start over OutputDebugStringA("Pipe error:\n"); OutputDebugStringA(e); if (attached) { mono_thread_detach(mono_selfthread); attached=FALSE; } } catch (...) { OutputDebugStringA("Unexpected pipe error\n"); if (attached) { mono_thread_detach(mono_selfthread); attached=FALSE; } } } }