[runtime] Add mono_assembly_get_reference_assembly_attribute
authorAleksey Kliger <aleksey@xamarin.com>
Tue, 23 Aug 2016 15:51:39 +0000 (11:51 -0400)
committerAleksey Kliger <aleksey@xamarin.com>
Thu, 1 Sep 2016 21:52:14 +0000 (17:52 -0400)
Checks whether the given assembly has the
System.Runtime.CompilerServices.ReferenceAssemblyAttribute applied.

mono/metadata/assembly.c
mono/metadata/domain-internals.h

index 4bad7dc5ed6d85719bd7426b3e906655c833c127..d018deb29fef95bdf8c2d55f45e566a213f6c1b3 100644 (file)
@@ -203,6 +203,7 @@ static GSList *loaded_assembly_bindings = NULL;
 
 /* Class lazy loading functions */
 static GENERATE_TRY_GET_CLASS_WITH_CACHE (internals_visible, System.Runtime.CompilerServices, InternalsVisibleToAttribute)
+static GENERATE_TRY_GET_CLASS_WITH_CACHE (reference_assembly, System.Runtime.CompilerServices, ReferenceAssemblyAttribute)
 
 static MonoAssembly*
 mono_assembly_invoke_search_hook_internal (MonoAssemblyName *aname, MonoAssembly *requesting, gboolean refonly, gboolean postload);
@@ -1803,6 +1804,37 @@ mono_assembly_load_friends (MonoAssembly* ass)
        mono_assemblies_unlock ();
 }
 
+
+/**
+ * mono_assembly_get_reference_assembly_attribute:
+ * @assembly: a MonoAssembly
+ * @error: set on error.
+ *
+ * Returns TRUE if @assembly has the System.Runtime.CompilerServices.ReferenceAssemblyAttribute set.
+ * On error returns FALSE and sets @error.
+ */
+gboolean
+mono_assembly_get_reference_assembly_attribute (MonoAssembly *assembly, MonoError *error)
+{
+       mono_error_init (error);
+
+       MonoCustomAttrInfo *attrs = mono_custom_attrs_from_assembly_checked (assembly, error);
+       return_val_if_nok (error, FALSE);
+       if (!attrs)
+               return FALSE;
+       MonoClass *ref_asm_class = mono_class_try_get_reference_assembly_class ();
+       gboolean result = FALSE;
+       for (int i = 0; i < attrs->num_attrs; ++i) {
+               MonoCustomAttrEntry *attr = &attrs->attrs [i];
+               if (attr->ctor && attr->ctor->klass && attr->ctor->klass == ref_asm_class) {
+                       result = TRUE;
+                       break;
+               }
+       }
+       mono_custom_attrs_free (attrs);
+       return result;
+}
+
 /**
  * mono_assembly_open:
  * @filename: Opens the assembly pointed out by this name
index e385adadfd5c1b29b241952e86dd661a1e78298b..500a87da63c77a146a2c5afd63e62a8d600ace00 100644 (file)
@@ -700,4 +700,8 @@ mono_runtime_init_checked (MonoDomain *domain, MonoThreadStartCB start_cb, MonoT
 void
 mono_context_init_checked (MonoDomain *domain, MonoError *error);
 
+gboolean
+mono_assembly_get_reference_assembly_attribute (MonoAssembly *assembly, MonoError *error);
+
+
 #endif /* __MONO_METADATA_DOMAIN_INTERNALS_H__ */