コード例 #1
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);
        }
コード例 #2
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);
        }
コード例 #3
0
        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);
        }