for (tmp = loaded_assemblies; tmp; tmp = tmp->next) {
MonoAssembly *ass = (MonoAssembly *)tmp->data;
- if (mono_assembly_names_equal (aname, &ass->aname))
+ if (mono_assembly_check_name_match (aname, &ass->aname))
return ass;
}
return NULL;
MonoAssemblyCandidatePredicate predicate = NULL;
void* predicate_ud = NULL;
-#if !defined(DISABLE_DESKTOP_LOADER)
- if (G_LIKELY (mono_loader_get_strict_strong_names ())) {
+ if (mono_loader_get_strict_assembly_name_check ()) {
predicate = &mono_assembly_candidate_predicate_sn_same_name;
predicate_ud = aname;
}
-#endif
MonoAssemblyOpenRequest req;
mono_assembly_request_prepare_open (&req, refonly ? MONO_ASMCTX_REFONLY : MONO_ASMCTX_DEFAULT, alc);
req.request.predicate = predicate;
{
MonoAssemblyCandidatePredicate predicate = NULL;
void* predicate_ud = NULL;
-#if !defined(DISABLE_DESKTOP_LOADER)
- if (G_LIKELY (mono_loader_get_strict_strong_names ())) {
+ if (mono_loader_get_strict_assembly_name_check ()) {
predicate = &mono_assembly_candidate_predicate_sn_same_name;
predicate_ud = aname;
}
-#endif
MonoAssemblyOpenRequest req;
mono_assembly_request_prepare_open (&req, asmctx, mono_domain_default_alc (mono_domain_get ()));
req.request.predicate = predicate;
g_assert (aname != NULL);
GSList *tmp;
MonoAssembly *ass;
- const gboolean strong_name = aname->public_key_token[0] != 0;
- /* If it's not a strong name, any version that has the right simple
- * name is good enough to satisfy the request. .NET Framework also
- * ignores case differences in this case. */
- const MonoAssemblyNameEqFlags eq_flags = (MonoAssemblyNameEqFlags)(strong_name ? MONO_ANAME_EQ_IGNORE_CASE :
- (MONO_ANAME_EQ_IGNORE_PUBKEY | MONO_ANAME_EQ_IGNORE_VERSION | MONO_ANAME_EQ_IGNORE_CASE));
#ifdef ENABLE_NETCORE
+ const MonoAssemblyNameEqFlags eq_flags = MONO_ANAME_EQ_IGNORE_PUBKEY | MONO_ANAME_EQ_IGNORE_VERSION | MONO_ANAME_EQ_IGNORE_CASE;
+
mono_alc_assemblies_lock (alc);
for (tmp = alc->loaded_assemblies; tmp; tmp = tmp->next) {
ass = (MonoAssembly *)tmp->data;
g_assert (ass != NULL);
- // TODO: Can dynamic assemblies match here for netcore? Also, this ignores case while exact_sn_match does not.
+ // FIXME: Can dynamic assemblies match here for netcore?
if (assembly_is_dynamic (ass) || !mono_assembly_names_equal_flags (aname, &ass->aname, eq_flags))
continue;
mono_alc_assemblies_unlock (alc);
#else
MonoDomain *domain = mono_alc_domain (alc);
+
+ const gboolean strong_name = aname->public_key_token[0] != 0;
+ /* If it's not a strong name, any version that has the right simple
+ * name is good enough to satisfy the request. .NET Framework also
+ * ignores case differences in this case. */
+ const MonoAssemblyNameEqFlags eq_flags = (MonoAssemblyNameEqFlags)(strong_name ? MONO_ANAME_EQ_IGNORE_CASE :
+ (MONO_ANAME_EQ_IGNORE_PUBKEY | MONO_ANAME_EQ_IGNORE_VERSION | MONO_ANAME_EQ_IGNORE_CASE));
+
mono_domain_assemblies_lock (domain);
for (tmp = domain->domain_assemblies; tmp; tmp = tmp->next) {
ass = (MonoAssembly *)tmp->data;
if (!parsed)
goto fail;
+ MonoAssemblyCandidatePredicate predicate = NULL;
+ void* predicate_ud = NULL;
+ if (mono_loader_get_strict_assembly_name_check ()) {
+ predicate = &mono_assembly_candidate_predicate_sn_same_name;
+ predicate_ud = &aname;
+ }
+ req.request.predicate = predicate;
+ req.request.predicate_ud = predicate_ud;
+
ass = mono_assembly_request_byname (&aname, &req, &status);
if (!ass)
goto fail;
gboolean
mono_assembly_candidate_predicate_sn_same_name (MonoAssembly *candidate, gpointer wanted_name);
+gboolean
+mono_assembly_check_name_match (MonoAssemblyName *wanted_name, MonoAssemblyName *candidate_name);
+
MonoAssembly*
mono_assembly_binding_applies_to_image (MonoAssemblyLoadContext *alc, MonoImage* image, MonoImageOpenStatus *status);
/* Assembly name matching */
static gboolean
-exact_sn_match (MonoAssemblyName *wanted_name, MonoAssemblyName *candidate_name);
-static gboolean
framework_assembly_sn_match (MonoAssemblyName *wanted_name, MonoAssemblyName *candidate_name);
static const char *
* predicate. It could be that we previously loaded a
* different version that happens to have the filename that
* we're currently probing. */
- if (mono_loader_get_strict_strong_names () &&
+ if (mono_loader_get_strict_assembly_name_check () &&
load_req.predicate && !load_req.predicate (image->assembly, load_req.predicate_ud)) {
mono_image_close (image);
g_free (fname);
g_free (s);
}
-
+#ifdef ENABLE_NETCORE
+ return mono_assembly_check_name_match (wanted_name, candidate_name);
+#else
/* Wanted name has no token, not strongly named: always matches. */
if (0 == wanted_name->public_key_token [0]) {
mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Predicate: wanted has no token, returning TRUE");
return FALSE;
}
- return exact_sn_match (wanted_name, candidate_name) ||
+ return mono_assembly_check_name_match (wanted_name, candidate_name) ||
framework_assembly_sn_match (wanted_name, candidate_name);
+#endif
}
gboolean
-exact_sn_match (MonoAssemblyName *wanted_name, MonoAssemblyName *candidate_name)
+mono_assembly_check_name_match (MonoAssemblyName *wanted_name, MonoAssemblyName *candidate_name)
{
#if ENABLE_NETCORE
gboolean result = mono_assembly_names_equal_flags (wanted_name, candidate_name, MONO_ANAME_EQ_IGNORE_VERSION | MONO_ANAME_EQ_IGNORE_PUBKEY);
if (result && assembly_names_compare_versions (wanted_name, candidate_name, -1) > 0)
result = FALSE;
#else
- gboolean result = mono_assembly_names_equal (wanted_name, candidate_name);
+ gboolean result = mono_assembly_names_equal_flags (wanted_name, candidate_name, MONO_ANAME_EQ_NONE);
#endif
mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Predicate: candidate and wanted names %s",
MonoAssemblyCandidatePredicate predicate = NULL;
void* predicate_ud = NULL;
-#if !defined(DISABLE_DESKTOP_LOADER)
- if (G_LIKELY (mono_loader_get_strict_strong_names ())) {
+ if (mono_loader_get_strict_assembly_name_check ()) {
predicate = &mono_assembly_candidate_predicate_sn_same_name;
predicate_ud = aname;
}
-#endif
MonoAssemblyOpenRequest req;
mono_assembly_request_prepare_open (&req, asmctx, alc);
mono_ginst_get_desc (GString *str, MonoGenericInst *ginst);
void
-mono_loader_set_strict_strong_names (gboolean enabled);
+mono_loader_set_strict_assembly_name_check (gboolean enabled);
gboolean
-mono_loader_get_strict_strong_names (void);
+mono_loader_get_strict_assembly_name_check (void);
gboolean
mono_type_in_image (MonoType *type, MonoImage *image);
#undef TABLEDEF
};
-/* If TRUE (but also see DISABLE_STICT_STRONG_NAMES #define), Mono will check
+/* On legacy, if TRUE (but also see DISABLE_DESKTOP_LOADER #define), Mono will check
* that the public key token, culture and version of a candidate assembly matches
- * the requested strong name. If FALSE, as long as the name matches, the candidate
- * will be allowed.
+ * the requested strong name. On netcore, it will check the culture and version.
+ * If FALSE, as long as the name matches, the candidate will be allowed.
*/
-static gboolean check_strong_names_strictly = FALSE;
+static gboolean check_assembly_names_strictly = FALSE;
// Amount initially reserved in each imageset's mempool.
// FIXME: This number is arbitrary, a more practical number should be found
}
void
-mono_loader_set_strict_strong_names (gboolean enabled)
+mono_loader_set_strict_assembly_name_check (gboolean enabled)
{
- check_strong_names_strictly = enabled;
+ check_assembly_names_strictly = enabled;
}
gboolean
-mono_loader_get_strict_strong_names (void)
+mono_loader_get_strict_assembly_name_check (void)
{
- return check_strong_names_strictly;
+#if !defined(DISABLE_DESKTOP_LOADER) || defined(ENABLE_NETCORE)
+ return check_assembly_names_strictly;
+#else
+ return FALSE;
+#endif
}
if (info->assembly.name) {
MonoAssembly *assembly = mono_assembly_loaded_internal (alc, &info->assembly, FALSE);
- if (!assembly && image && image->assembly && mono_assembly_names_equal (&info->assembly, &image->assembly->aname))
+ if (!assembly && image && image->assembly && mono_assembly_check_name_match (&info->assembly, &image->assembly->aname))
/*
* This could happen in the AOT compiler case when the search hook is not
* installed.
} else if (strncmp (argv [i], "--assembly-loader=", strlen("--assembly-loader=")) == 0) {
gchar *arg = argv [i] + strlen ("--assembly-loader=");
if (strcmp (arg, "strict") == 0)
- mono_loader_set_strict_strong_names (TRUE);
+ mono_loader_set_strict_assembly_name_check (TRUE);
else if (strcmp (arg, "legacy") == 0)
- mono_loader_set_strict_strong_names (FALSE);
+ mono_loader_set_strict_assembly_name_check (FALSE);
else
fprintf (stderr, "Warning: unknown argument to --assembly-loader. Should be \"strict\" or \"legacy\"\n");
} else if (strncmp (argv [i], MONO_HANDLERS_ARGUMENT, MONO_HANDLERS_ARGUMENT_LEN) == 0) {
/*
* Don't use Mono's legacy assembly name matching behavior - respect
- * the requested version and public key token.
+ * the requested version and culture.
*/
- mono_loader_set_strict_strong_names (TRUE);
+ mono_loader_set_strict_assembly_name_check (TRUE);
return 0;
}
-nomethod System.Reflection.Tests.MetadataLoadContextTests.RelocatableAssembly
####################################################################
-## System.Runtime.Loader.DefaultContext.Tests
-####################################################################
-
-# Expected FileNotFoundException, got none
-# https://github.com/mono/mono/issues/15195
--nomethod System.Runtime.Loader.Tests.DefaultLoadContextTests.LoadInDefaultContext
-
-####################################################################
## System.Runtime.Loader.RefEmitLoadContext.Tests
####################################################################