当我使用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;
}
答案 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;