//============================================================ // <T>析构脚本工作器。</T> // // @return 处理结果 //============================================================ TResult FMonoLibrary::Open(){ TResult resultCd = FScriptLibrary::Open(); // 打开资源 FAssetStream* pStream = RAssetManager::Instance().OpenAssetStreamFormat(_name); MO_ERROR_CHECK(pStream, return NULL, "Open template stream failure. (name=%s)", (TCharC*)_name); // 加载映像 MonoImageOpenStatus statusCd = MONO_IMAGE_IMAGE_INVALID; _pMonoImage = mono_image_open_from_data_full((TChar*)pStream->MemoryC(), pStream->Length(), true, &statusCd, false); MO_FATAL_CHECK(_pMonoImage, return EFailure, "Open assembly image failure. (name=%s)", (TCharC*)_name); if(statusCd != MONO_IMAGE_OK){ MO_FATAL("Open assembly image failure. (file_name=%s)", _name); return EFailure; } // 加载装配数据 MonoImageOpenStatus assemblyStatusCd = MONO_IMAGE_IMAGE_INVALID; MonoAssembly* pAssembly = mono_assembly_load_from_full(_pMonoImage, _name, &assemblyStatusCd, false); MO_FATAL_CHECK(pAssembly, return EFailure, "Load assembly failure. (name=%s)", (TCharC*)_name); if(mono_assembly_get_image(pAssembly) != _pMonoImage){ MO_FATAL("Check mono image failure. (image=0x%08X)", _pMonoImage); return EFailure; } // 释放资源 RAssetManager::Instance().CloseAssetStream(pStream); return resultCd; }
//##################################################################### // Function loadAssembly //##################################################################### bool MonoSystem::loadMemoryAssembly(char* membuf, unsigned int len) const { MonoAssembly *ass; MonoImageOpenStatus status = MONO_IMAGE_OK; MonoImage *image = mono_image_open_from_data_full(membuf, len, TRUE, &status, false); if (!image) { // bad image format printf("Error loading image from memory: %d\n", status); return false; } ass = mono_assembly_load_from_full (image, "", &status, false); if (!ass) { printf("Error loading assembly from memory: %d\n", status); // FIXME real error reporting // bad image format? mono_image_close (image); return false; } return true; }