Exemple #1
0
        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;
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        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;
        }