public static void Init(string[] searchPaths) { dnaCorlibAssemblies = S.buildArray( "mscorlib", "System", "System.Core", null ); #if UNITY_5 || UNITY_2017 || UNITY_2018 monoAssemblies = S.buildArray( "UnityEngine", "UnityEngine.UI", "UnityEngine.CoreModule", "UnityEngine.AudioModule", "UnityEngine.AnimationModule", "UnityEngine.InputModule", "UnityEngine.ParticleSystemModule", "UnityEngine.PhysicsModule", "UnityEngine.Physics2DModule", null ); unityModuleAssemblies = S.buildArray( "UnityEngine.CoreModule", "UnityEngine.AudioModule", "UnityEngine.AnimationModule", "UnityEngine.InputModule", "UnityEngine.ParticleSystemModule", "UnityEngine.PhysicsModule", "UnityEngine.Physics2DModule", null ); #else monoAssemblies = S.buildArray( null ); unityModuleAssemblies = S.buildArray( null ); #endif assemblySearchPaths = S.buildArray(searchPaths); assemblySearchPathsCount = searchPaths.Length; scCorLib = new S("corlib"); pFilesLoaded = null; }
public static tCLIFile *WrapMonoAssembly(/*char**/ byte *pAssemblyName) { tCLIFile * pRet; tFilesLoaded *pNewFile; tMetaData * pMetaData; System.Reflection.Assembly assembly = null; string assemblyName = Marshal.PtrToStringAnsi((System.IntPtr)pAssemblyName); System.Reflection.Assembly[] assemblies = System.AppDomain.CurrentDomain.GetAssemblies(); for (int i = 0; i < assemblies.Length; i++) { System.Reflection.Assembly assem = assemblies[i]; if (assem.GetName().Name == assemblyName) { assembly = assem; break; } } if (assembly == null) { Sys.Crash("Unable to load assembly file %s", (PTR)pAssemblyName); } pRet = ((tCLIFile *)Mem.malloc((SIZE_T)sizeof(tCLIFile))); Mem.memset(pRet, 0, (SIZE_T)sizeof(tCLIFile)); pRet->pMetaData = pMetaData = MetaData.New(); MetaData.WrapMonoAssembly(pMetaData, assembly); string codeBase = assembly.CodeBase; System.UriBuilder uri = new System.UriBuilder(codeBase); string path = System.Uri.UnescapeDataString(uri.Path); string assmName = System.IO.Path.GetFileNameWithoutExtension(path); pRet->assemblyName = new S(assmName); // 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 *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 tMD_TypeDef *FindTypeInAllLoadedAssemblies(/*STRING*/ byte *nameSpace, /*STRING*/ byte *name) { tFilesLoaded *pFiles = pFilesLoaded; while (pFiles != null) { tCLIFile *pCLIFile = pFiles->pCLIFile; tMD_TypeDef *typeDef = MetaData.GetTypeDefFromName(pCLIFile->pMetaData, nameSpace, name, null, /* assertExists */ 0); if (typeDef != null) { return(typeDef); } pFiles = pFiles->pNext; } Sys.Crash("CLIFile_FindTypeInAllLoadedAssemblies(): Cannot find type %s.%s", (PTR)nameSpace, (PTR)name); return(null); }
public static void Clear() { // Release metadata images tFilesLoaded *pFiles = pFilesLoaded; while (pFiles != null) { if (pFiles->pCLIFile->gcHandle != 0) { GCHandle handle = GCHandle.FromIntPtr((System.IntPtr)pFiles->pCLIFile->gcHandle); handle.Free(); } pFiles = pFiles->pNext; } pFilesLoaded = null; monoAssemblies = null; unityModuleAssemblies = null; dnaCorlibAssemblies = null; assemblySearchPaths = null; assemblySearchPathsCount = 0; scCorLib = null; }