#ifndef __MONO_METADATA_ASSEMBLY_INTERNALS_H__
#define __MONO_METADATA_ASSEMBLY_INTERNALS_H__
+#include <glib.h>
+
#include <mono/metadata/assembly.h>
MONO_API MonoImage* mono_assembly_load_module_checked (MonoAssembly *assembly, uint32_t idx, MonoError *error);
MonoAssembly * mono_assembly_open_a_lot (const char *filename, MonoImageOpenStatus *status, gboolean refonly, gboolean load_from_context);
+/* If predicate returns true assembly should be loaded, if false ignore it. */
+typedef gboolean (*MonoAssemblyOpenPredicate)(MonoAssembly *, gpointer);
+
+MonoAssembly* mono_assembly_open_predicate (const char *filename,
+ gboolean refonly,
+ gboolean load_from_context,
+ MonoAssemblyOpenPredicate pred,
+ gpointer user_data,
+ MonoImageOpenStatus *status);
+
#endif /* __MONO_METADATA_ASSEMBLY_INTERNALS_H__ */
MonoAssembly *
mono_assembly_open_a_lot (const char *filename, MonoImageOpenStatus *status, gboolean refonly, gboolean load_from_context)
{
+ return mono_assembly_open_predicate (filename, refonly, load_from_context, NULL, NULL, status);
+}
+MonoAssembly *
+mono_assembly_open_predicate (const char *filename, gboolean refonly,
+ gboolean load_from_context,
+ MonoAssemblyOpenPredicate predicate,
+ gpointer user_data,
+ MonoImageOpenStatus *status)
+{
MonoImage *image;
MonoAssembly *ass;
MonoImageOpenStatus def_status;
mono_assembly_invoke_load_hook (image->assembly);
mono_image_close (image);
g_free (fname);
- return image->assembly;
+ if (!predicate || predicate (image->assembly, user_data)) {
+ return image->assembly;
+ } else {
+ *status = MONO_IMAGE_IMAGE_INVALID;
+ return NULL;
+ }
}
ass = mono_assembly_load_from_full (image, fname, status, refonly);
+ if (ass && predicate && !predicate (ass, user_data)) {
+ *status = MONO_IMAGE_IMAGE_INVALID;
+ ass = NULL;
+ }
+
if (ass) {
if (!loaded_from_bundle)
mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY,
MonoAssembly *
mono_assembly_open (const char *filename, MonoImageOpenStatus *status)
{
- return mono_assembly_open_full (filename, status, FALSE);
+ return mono_assembly_open_predicate (filename, FALSE, FALSE, NULL, NULL, status);
}
/**