public static tMetaData *GetMetaDataForLoadedAssembly(byte *pLoadedAssemblyName) { tFilesLoaded *pFiles = pFilesLoaded; while (pFiles != null) { tCLIFile * pCLIFile = pFiles->pCLIFile; tMD_Assembly *pThisAssembly = (tMD_Assembly *)MetaData.GetTableRow(pCLIFile->pMetaData, MetaData.MAKE_TABLE_INDEX(0x20, 1)); if (S.strcmp(pLoadedAssemblyName, pThisAssembly->name) == 0) { // Found the correct assembly, so return its meta-data return(pCLIFile->pMetaData); } pFiles = pFiles->pNext; } Sys.Crash("Assembly %s is not loaded\n", (PTR)pLoadedAssemblyName); return(null); }
public static tCLIFile *LoadAssembly(/*char**/ byte *pFileName) { byte[] rawData; tCLIFile * pRet; tFilesLoaded *pNewFile; byte * filepath = stackalloc byte[512]; tMD_Assembly *pThisAssembly = null; rawData = null; for (int i = 0; i < assemblySearchPathsCount; i++) { S.snprintf(filepath, 512, "%s/%s", (PTR)assemblySearchPaths[i], (PTR)pFileName); rawData = LoadFileFromDisk(filepath); if (rawData != null) { break; } } if (rawData == null) { Sys.Crash("Unable to load assembly file %s", (PTR)pFileName); } Sys.log_f(1, "\nLoading file: %s\n", (PTR)pFileName); pRet = LoadPEFile(rawData); // Get the assembly info - there is only ever one of these in the each file's metadata pThisAssembly = (tMD_Assembly *)MetaData.GetTableRow(pRet->pMetaData, MetaData.MAKE_TABLE_INDEX(0x20, 1)); int nameLen = S.strlen(pThisAssembly->name) + 1; pRet->assemblyName = (byte *)Mem.mallocForever((uint)nameLen); S.strncpy(pRet->assemblyName, pThisAssembly->name, nameLen); // Record that we've loaded this file pNewFile = ((tFilesLoaded *)Mem.mallocForever((SIZE_T)sizeof(tFilesLoaded))); pNewFile->pCLIFile = pRet; pNewFile->pNext = pFilesLoaded; pFilesLoaded = pNewFile; return(pRet); }
public static tMetaData *GetMetaDataForAssembly(byte *pAssemblyName) { tFilesLoaded *pFiles; int monoAssembly = 0; tCLIFile * pCLIFile = null; tMD_Assembly *pThisAssembly = null; tMetaData ** ppChildMetaData = null; int i, j, childCount; // Check corlib assemblies i = 0; while (dnaCorlibAssemblies[i] != null) { if (S.strcmp(pAssemblyName, dnaCorlibAssemblies[i]) == 0) { pAssemblyName = scCorLib; break; } i++; } // Look in already-loaded files first pFiles = pFilesLoaded; while (pFiles != null) { pCLIFile = pFiles->pCLIFile; if (S.strcmp(pAssemblyName, pCLIFile->assemblyName) == 0) { // Found the correct assembly, so return its meta-data return(pCLIFile->pMetaData); } pFiles = pFiles->pNext; } // Mono/Unity assemblies only load metadata, no code if (monoAssemblies != null) { i = 0; while (monoAssemblies[i] != null) { if (S.strcmp(pAssemblyName, monoAssemblies[i]) == 0) { if (i == 0) { // Handle "UnityEngine" assemblies j = 0; childCount = 0; while (unityModuleAssemblies[j] != null) { childCount++; j++; } ppChildMetaData = (tMetaData **)Mem.malloc((SIZE_T)((childCount + 1) * sizeof(tMetaData *))); Mem.memset(ppChildMetaData, 0, (SIZE_T)((childCount + 1) * sizeof(tMetaData *))); j = 0; while (unityModuleAssemblies[j] != null) { ppChildMetaData[j] = GetMetaDataForAssembly(unityModuleAssemblies[j]); j++; } } monoAssembly = 1; break; } i++; } } // Assembly not loaded, so load it if possible if (monoAssembly != 0) { pCLIFile = CLIFile.WrapMonoAssembly(pAssemblyName); if (pCLIFile == null) { Sys.Crash("Cannot load required mono assembly file: %s.dll", (PTR)pAssemblyName); } } else { byte *fileName = stackalloc byte[256]; S.snprintf(fileName, 256, "%s.dll", (PTR)pAssemblyName); pCLIFile = CLIFile.LoadAssembly(fileName); if (pCLIFile == null) { Sys.Crash("Cannot load required assembly file: %s.dll", (PTR)pAssemblyName); } } pCLIFile->pMetaData->ppChildMetaData = ppChildMetaData; return(pCLIFile->pMetaData); }