--- a/mono/gplugin-mono-core.c Sat Jul 12 13:21:49 2014 -0500
+++ b/mono/gplugin-mono-core.c Sun Jul 20 03:35:08 2014 -0500
@@ -39,7 +39,8 @@
"version", GPLUGIN_VERSION,
"summary", "A plugin that can load mono plugins",
- "description", "This plugin loads plugins written in .Net with Mono",
+ "description", "This plugin loads plugins written in .Net with the " \ "website", GPLUGIN_WEBSITE,
--- a/mono/gplugin-mono-loader.c Sat Jul 12 13:21:49 2014 -0500
+++ b/mono/gplugin-mono-loader.c Sun Jul 20 03:35:08 2014 -0500
@@ -22,16 +22,22 @@
#include <mono/jit/jit.h>
#include <mono/metadata/assembly.h>
+#include <mono/metadata/image.h> /******************************************************************************
*****************************************************************************/
static GObjectClass *parent_class = NULL;
static GType type_real = 0;
+static MonoDomain *domain = NULL; /******************************************************************************
*****************************************************************************/
+gplugin_mono_loader_init_mono(void) { + domain = mono_jit_init("gplugin"); /******************************************************************************
* GPluginLoaderInterface API
@@ -46,15 +52,83 @@
-gplugin_mono_loader_query(GPluginLoader *loader, const gchar *filename,
+gplugin_mono_loader_query(GPLUGIN_UNUSED GPluginLoader *loader, - MonoDomain *domain = NULL;
+ GPluginPluginInfo *info = NULL; MonoAssembly *assembly = NULL;
+ MonoImage *image = NULL; + MonoImageOpenStatus status; + MonoClass *klass = NULL; + MonoMethod *query = NULL, *load = NULL, *unload = NULL; + MonoObject *info_obj = NULL; + assembly = mono_assembly_open(filename, &status); + const char *msg = NULL; + case MONO_IMAGE_ERROR_ERRNO: + case MONO_IMAGE_MISSING_ASSEMBLYREF: + msg = "missing assembly reference"; + case MONO_IMAGE_IMAGE_INVALID: + *error = g_error_new(GPLUGIN_DOMAIN, 0, + "Failed to load %s: %s", - domain = mono_jit_init("gplugin");
+ /* okay, the code loaded, now get it as an image */ + image = mono_assembly_get_image(assembly); + *error = g_error_new(GPLUGIN_DOMAIN, 0, + "Failed to load %s: could not get image from assembly", - assembly = mono_domain_assembly_open(domain, filename);
+ /* now that we have the image, get the Plugin class */ + klass = mono_class_from_name(image, "", "Plugin"); + *error = g_error_new(GPLUGIN_DOMAIN, 0, + "Failed to load %s: No Plugin class found", + /* Now find the query method */ + query = mono_class_get_method_from_name(klass, "Query", 0); + *error = g_error_new(GPLUGIN_DOMAIN, 0, + "Failed to load %s: No Query method found", @@ -94,6 +168,9 @@
loader_class->query = gplugin_mono_loader_query;
loader_class->load = gplugin_mono_loader_load;
loader_class->unload = gplugin_mono_loader_unload;
+ gplugin_mono_loader_init_mono(); /******************************************************************************
--- a/mono/tests/plugins/basic.cs Sat Jul 12 13:21:49 2014 -0500
+++ b/mono/tests/plugins/basic.cs Sun Jul 20 03:35:08 2014 -0500
@@ -1,8 +1,8 @@
- static GPlugin.PluginInfo query() {
+public class MonoPlugin : Plugin { + static PluginInfo Query() { + return PluginInfo.new();