[netcore] Make the load hook ALC-aware (#16012)
[mono-project.git] / mono / metadata / assembly-internals.h
blob5aa7f3d533c69c2d3aff728c8be1d6c2ad7f6041
1 /**
2 * \file
3 * Copyright 2015 Xamarin Inc
4 * Licensed under the MIT license. See LICENSE file in the project root for full license information.
5 */
6 #ifndef __MONO_METADATA_ASSEMBLY_INTERNALS_H__
7 #define __MONO_METADATA_ASSEMBLY_INTERNALS_H__
9 #include <glib.h>
11 #include <mono/metadata/assembly.h>
12 #include <mono/metadata/metadata-internals.h>
14 #ifndef ENABLE_NETCORE
15 #define MONO_ASSEMBLY_CORLIB_NAME "mscorlib"
16 #else
17 #define MONO_ASSEMBLY_CORLIB_NAME "System.Private.CoreLib"
18 #endif
20 /* Flag bits for mono_assembly_names_equal_flags (). */
21 typedef enum {
22 /* Default comparison: all fields must match */
23 MONO_ANAME_EQ_NONE = 0x0,
24 /* Don't compare public key token */
25 MONO_ANAME_EQ_IGNORE_PUBKEY = 0x1,
26 /* Don't compare the versions */
27 MONO_ANAME_EQ_IGNORE_VERSION = 0x2,
28 /* When comparing simple names, ignore case differences */
29 MONO_ANAME_EQ_IGNORE_CASE = 0x4,
31 MONO_ANAME_EQ_MASK = 0x7
32 } MonoAssemblyNameEqFlags;
34 G_ENUM_FUNCTIONS (MonoAssemblyNameEqFlags);
36 void
37 mono_assembly_name_free_internal (MonoAssemblyName *aname);
39 gboolean
40 mono_assembly_name_culture_is_neutral (const MonoAssemblyName *aname);
42 gboolean
43 mono_assembly_names_equal_flags (MonoAssemblyName *l, MonoAssemblyName *r, MonoAssemblyNameEqFlags flags);
45 gboolean
46 mono_assembly_get_assemblyref_checked (MonoImage *image, int index, MonoAssemblyName *aname, MonoError *error);
48 MONO_API MonoImage* mono_assembly_load_module_checked (MonoAssembly *assembly, uint32_t idx, MonoError *error);
50 MonoAssembly* mono_assembly_load_with_partial_name_internal (const char *name, MonoImageOpenStatus *status);
53 typedef gboolean (*MonoAssemblyAsmCtxFromPathFunc) (const char *absfname, MonoAssembly *requesting_assembly, gpointer user_data, MonoAssemblyContextKind *out_asmctx);
55 void mono_install_assembly_asmctx_from_path_hook (MonoAssemblyAsmCtxFromPathFunc func, gpointer user_data);
57 typedef MonoAssembly * (*MonoAssemblyPreLoadFuncV2) (MonoAssemblyLoadContext *alc, MonoAssemblyName *aname, char **assemblies_path, gboolean refonly, gpointer user_data, MonoError *error);
59 void mono_install_assembly_preload_hook_v2 (MonoAssemblyPreLoadFuncV2 func, gpointer user_data, gboolean refonly);
61 typedef MonoAssembly * (*MonoAssemblySearchFuncV2) (MonoAssemblyLoadContext *alc, MonoAssembly *requesting, MonoAssemblyName *aname, gboolean refonly, gboolean postload, gpointer user_data, MonoError *error);
63 void
64 mono_install_assembly_search_hook_v2 (MonoAssemblySearchFuncV2 func, gpointer user_data, gboolean refonly, gboolean postload);
66 typedef void (*MonoAssemblyLoadFuncV2) (MonoAssemblyLoadContext *alc, MonoAssembly *assembly, gpointer user_data, MonoError *error);
68 void
69 mono_install_assembly_load_hook_v2 (MonoAssemblyLoadFuncV2 func, gpointer user_data);
71 void
72 mono_assembly_invoke_load_hook_internal (MonoAssemblyLoadContext *alc, MonoAssembly *ass);
74 /* If predicate returns true assembly should be loaded, if false ignore it. */
75 typedef gboolean (*MonoAssemblyCandidatePredicate)(MonoAssembly *, gpointer);
77 typedef struct MonoAssemblyLoadRequest {
78 /* Assembly Load context that is requesting an assembly. */
79 MonoAssemblyContextKind asmctx;
80 MonoAssemblyLoadContext *alc;
81 /* Predicate to apply to candidate assemblies. Optional. */
82 MonoAssemblyCandidatePredicate predicate;
83 /* user_data for predicate. Optional. */
84 gpointer predicate_ud;
85 } MonoAssemblyLoadRequest;
87 typedef struct MonoAssemblyOpenRequest {
88 MonoAssemblyLoadRequest request;
89 /* Assembly that is requesting the wanted assembly. Optional. */
90 MonoAssembly *requesting_assembly;
91 } MonoAssemblyOpenRequest;
93 typedef struct MonoAssemblyByNameRequest {
94 MonoAssemblyLoadRequest request;
95 /* Assembly that is requesting the wanted assembly name. Optional.
96 * If no_postload_search is TRUE, requesting_assembly is not used.
98 MonoAssembly *requesting_assembly;
99 /* basedir to probe for the wanted assembly name. Optional. */
100 const char *basedir;
101 gboolean no_postload_search; /* FALSE is usual */
102 /* FIXME: predicate unused? */
103 } MonoAssemblyByNameRequest;
105 void mono_assembly_request_prepare (MonoAssemblyLoadRequest *req,
106 size_t req_size,
107 MonoAssemblyContextKind asmctx);
109 MonoAssembly* mono_assembly_request_open (const char *filename,
110 const MonoAssemblyOpenRequest *req,
111 MonoImageOpenStatus *status);
113 MonoAssembly* mono_assembly_request_load_from (MonoImage *image, const char *fname,
114 const MonoAssemblyLoadRequest *req,
115 MonoImageOpenStatus *status);
117 MonoAssembly* mono_assembly_request_byname (MonoAssemblyName *aname,
118 const MonoAssemblyByNameRequest *req,
119 MonoImageOpenStatus *status);
121 /* MonoAssemblyCandidatePredicate that compares the assembly name (name, version,
122 * culture, public key token) of the candidate with the wanted name, if the
123 * wanted name has a public key token (if not present, always return true).
124 * Pass the wanted MonoAssemblyName* as the user_data.
126 gboolean
127 mono_assembly_candidate_predicate_sn_same_name (MonoAssembly *candidate, gpointer wanted_name);
129 MonoAssembly*
130 mono_assembly_binding_applies_to_image (MonoImage* image, MonoImageOpenStatus *status);
132 MonoAssembly*
133 mono_assembly_load_from_assemblies_path (gchar **assemblies_path, MonoAssemblyName *aname, MonoAssemblyContextKind asmctx);
135 MonoAssembly *
136 mono_assembly_loaded_internal (MonoAssemblyLoadContext *alc, MonoAssemblyName *aname, gboolean refonly);
138 MONO_PROFILER_API MonoAssemblyName*
139 mono_assembly_get_name_internal (MonoAssembly *assembly);
141 MONO_PROFILER_API MonoImage*
142 mono_assembly_get_image_internal (MonoAssembly *assembly);
144 #endif /* __MONO_METADATA_ASSEMBLY_INTERNALS_H__ */