mono_assembly_open和mono_image_open_from_data_with_name有什么区别?

时间:2018-10-19 06:49:45

标签: unity3d mono

当我使用mono_assembly_open时,我想加载.net程序集模块。但是当我使用mono_image_open_from_data_with_name时,它不起作用,无法遍历我要加载的模块。

void *load_image_from_file(const char *full_file_path)
{   
    if (full_file_path == NULL)
    {
        return NULL;
    }
    if (!PathFileExistsA(full_file_path))
    {
        return NULL;
    }

    HANDLE file = CreateFileA(full_file_path, FILE_READ_ACCESS, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (file == INVALID_HANDLE_VALUE)
    {
        return NULL;
    }

    DWORD file_size = GetFileSize(file, NULL);
    if (file_size == INVALID_FILE_SIZE)
    {
        CloseHandle(file);
        return NULL;
    }

    byte *file_data = reinterpret_cast<byte *>(malloc(file_size));
    if (file_data == NULL)
    {
        CloseHandle(file);
        return NULL;
    }

    DWORD read = 0;
    ReadFile(file, file_data, file_size, &read, NULL);
    if (file_size != read)
    {
        free(file_data);
        CloseHandle(file);
        return NULL;
    }

    MonoImageOpenStatus status;
    void *image = mono_image_open_from_data_with_name(reinterpret_cast<char *>(file_data), file_size, MONO_TRUE, &status, MONO_FALSE, full_file_path);
    free(file_data);
    return image;
}  

1 个答案:

答案 0 :(得分:1)

在调用mono_image_open_from_data_with_name之后,您应该调用mono_assembly_load_from_full。

   if (status != MONO_IMAGE_OK)
   {
        RPCS_ERROR("Open Image Failed %s", full_file_path);
        return NULL;
   }

    void *assembly = mono_image_get_assembly_(image);
    if (assembly == NULL)
    {
        assembly = mono_assembly_load_from_full_(image, full_file_path, &status, MONO_FALSE);
    }

    mono_image_close_(image);
    return assembly;