1 | // Licensed to the .NET Foundation under one or more agreements. |
2 | // The .NET Foundation licenses this file to you under the MIT license. |
3 | // See the LICENSE file in the project root for more information. |
4 | // ============================================================ |
5 | // |
6 | // AssemblyBinder.hpp |
7 | // |
8 | |
9 | |
10 | // |
11 | // Defines the AssemblyBinder class |
12 | // |
13 | // ============================================================ |
14 | |
15 | #ifndef __BINDER__ASSEMBLY_BINDER_HPP__ |
16 | #define __BINDER__ASSEMBLY_BINDER_HPP__ |
17 | |
18 | #include "bindertypes.hpp" |
19 | #include "bindresult.hpp" |
20 | #include "coreclrbindercommon.h" |
21 | |
22 | class CLRPrivBinderAssemblyLoadContext; |
23 | class CLRPrivBinderCoreCLR; |
24 | |
25 | namespace BINDER_SPACE |
26 | { |
27 | typedef enum |
28 | { |
29 | kBindingStoreGAC = 0x01, |
30 | kBindingStoreManifest = 0x02, |
31 | kBindingStoreHost = 0x04, |
32 | kBindingStoreContext = 0x08 |
33 | } BindingStore; |
34 | |
35 | class AssemblyBinder |
36 | { |
37 | public: |
38 | static HRESULT Startup(); |
39 | |
40 | // See code:BINDER_SPACE::AssemblyBinder::GetAssembly for info on fNgenExplicitBind |
41 | // and fExplicitBindToNativeImage, and see code:CEECompileInfo::LoadAssemblyByPath |
42 | // for an example of how they're used. |
43 | static HRESULT BindAssembly(/* in */ ApplicationContext *pApplicationContext, |
44 | /* in */ AssemblyName *pAssemblyName, |
45 | /* in */ LPCWSTR szCodeBase, |
46 | /* in */ PEAssembly *pParentAssembly, |
47 | /* in */ BOOL fNgenExplicitBind, |
48 | /* in */ BOOL fExplicitBindToNativeImage, |
49 | /* in */ bool excludeAppPaths, |
50 | /* out */ Assembly **ppAssembly); |
51 | |
52 | static HRESULT BindToSystem(/* in */ SString &systemDirectory, |
53 | /* out */ Assembly **ppSystemAssembly, |
54 | /* in */ bool fBindToNativeImage); |
55 | |
56 | static HRESULT BindToSystemSatellite(/* in */ SString &systemDirectory, |
57 | /* in */ SString &simpleName, |
58 | /* in */ SString &cultureName, |
59 | /* out */ Assembly **ppSystemAssembly); |
60 | |
61 | static HRESULT GetAssemblyFromImage(/* in */ PEImage *pPEImage, |
62 | /* in */ PEImage *pNativePEImage, |
63 | /* out */ Assembly **ppAssembly); |
64 | |
65 | // Special assembly binder entry point for byte arrays |
66 | static HRESULT PreBindByteArray(/* in */ ApplicationContext *pApplicationContext, |
67 | /* in */ PEImage *pPEImage, |
68 | /* in */ BOOL fInspectionOnly); |
69 | |
70 | static HRESULT GetAssembly(/* in */ SString &assemblyPath, |
71 | /* in */ BOOL fInspectionOnly, |
72 | /* in */ BOOL fIsInGAC, |
73 | /* in */ BOOL fExplicitBindToNativeImage, |
74 | /* out */ Assembly **ppAssembly, |
75 | /* in */ LPCTSTR szMDAssemblyPath = NULL); |
76 | |
77 | #if !defined(DACCESS_COMPILE) && !defined(CROSSGEN_COMPILE) |
78 | static HRESULT BindUsingHostAssemblyResolver (/* in */ INT_PTR pManagedAssemblyLoadContextToBindWithin, |
79 | /* in */ AssemblyName *pAssemblyName, |
80 | /* in */ IAssemblyName *pIAssemblyName, |
81 | /* in */ CLRPrivBinderCoreCLR *pTPABinder, |
82 | /* out */ Assembly **ppAssembly); |
83 | |
84 | static HRESULT BindUsingPEImage(/* in */ ApplicationContext *pApplicationContext, |
85 | /* in */ BINDER_SPACE::AssemblyName *pAssemblyName, |
86 | /* in */ PEImage *pPEImage, |
87 | /* in */ PEKIND peKind, |
88 | /* in */ IMDInternalImport *pIMetaDataAssemblyImport, |
89 | /* [retval] [out] */ Assembly **ppAssembly); |
90 | #endif // !defined(DACCESS_COMPILE) && !defined(CROSSGEN_COMPILE) |
91 | |
92 | static HRESULT TranslatePEToArchitectureType(DWORD *pdwPAFlags, PEKIND *PeKind); |
93 | |
94 | protected: |
95 | enum |
96 | { |
97 | BIND_NONE = 0x00, |
98 | BIND_CACHE_FAILURES = 0x01, |
99 | BIND_CACHE_RERUN_BIND = 0x02, |
100 | BIND_IGNORE_DYNAMIC_BINDS = 0x04 |
101 | #if !defined(DACCESS_COMPILE) && !defined(CROSSGEN_COMPILE) |
102 | , |
103 | BIND_IGNORE_REFDEF_MATCH = 0x8 |
104 | #endif // !defined(DACCESS_COMPILE) && !defined(CROSSGEN_COMPILE) |
105 | }; |
106 | |
107 | static BOOL IgnoreDynamicBinds(DWORD dwBindFlags) |
108 | { |
109 | return ((dwBindFlags & BIND_IGNORE_DYNAMIC_BINDS) != 0); |
110 | } |
111 | |
112 | static BOOL CacheBindFailures(DWORD dwBindFlags) |
113 | { |
114 | return ((dwBindFlags & BIND_CACHE_FAILURES) != 0); |
115 | } |
116 | |
117 | static BOOL RerunBind(DWORD dwBindFlags) |
118 | { |
119 | return ((dwBindFlags & BIND_CACHE_RERUN_BIND) != 0); |
120 | } |
121 | |
122 | #if !defined(DACCESS_COMPILE) && !defined(CROSSGEN_COMPILE) |
123 | static BOOL IgnoreRefDefMatch(DWORD dwBindFlags) |
124 | { |
125 | return ((dwBindFlags & BIND_IGNORE_REFDEF_MATCH) != 0); |
126 | } |
127 | #endif // !defined(DACCESS_COMPILE) && !defined(CROSSGEN_COMPILE) |
128 | |
129 | static HRESULT BindByName(/* in */ ApplicationContext *pApplicationContext, |
130 | /* in */ AssemblyName *pAssemblyName, |
131 | /* in */ DWORD dwBindFlags, |
132 | /* in */ bool excludeAppPaths, |
133 | /* out */ BindResult *pBindResult); |
134 | |
135 | // See code:BINDER_SPACE::AssemblyBinder::GetAssembly for info on fNgenExplicitBind |
136 | // and fExplicitBindToNativeImage, and see code:CEECompileInfo::LoadAssemblyByPath |
137 | // for an example of how they're used. |
138 | static HRESULT BindWhereRef(/* in */ ApplicationContext *pApplicationContext, |
139 | /* in */ PathString &assemblyPath, |
140 | /* in */ BOOL fNgenExplicitBind, |
141 | /* in */ BOOL fExplicitBindToNativeImage, |
142 | /* in */ bool excludeAppPaths, |
143 | /* out */ BindResult *pBindResult); |
144 | |
145 | static HRESULT BindLocked(/* in */ ApplicationContext *pApplicationContext, |
146 | /* in */ AssemblyName *pAssemblyName, |
147 | /* in */ DWORD dwBindFlags, |
148 | /* in */ bool excludeAppPaths, |
149 | /* out */ BindResult *pBindResult); |
150 | static HRESULT BindLockedOrService(/* in */ ApplicationContext *pApplicationContext, |
151 | /* in */ AssemblyName *pAssemblyName, |
152 | /* in */ bool excludeAppPaths, |
153 | /* out */ BindResult *pBindResult); |
154 | |
155 | static HRESULT FindInExecutionContext(/* in */ ApplicationContext *pApplicationContext, |
156 | /* in */ AssemblyName *pAssemblyName, |
157 | /* out */ ContextEntry **ppContextEntry); |
158 | |
159 | static HRESULT BindByTpaList(/* in */ ApplicationContext *pApplicationContext, |
160 | /* in */ AssemblyName *pRequestedAssemblyName, |
161 | /* in */ BOOL fInspectionOnly, |
162 | /* in */ bool excludeAppPaths, |
163 | /* out */ BindResult *pBindResult); |
164 | |
165 | static HRESULT Register(/* in */ ApplicationContext *pApplicationContext, |
166 | /* in */ BOOL fInspectionOnly, |
167 | /* in */ BindResult *pBindResult); |
168 | static HRESULT RegisterAndGetHostChosen(/* in */ ApplicationContext *pApplicationContext, |
169 | /* in */ LONG kContextVersion, |
170 | /* in */ BindResult *pBindResult, |
171 | /* out */ BindResult *pHostBindResult); |
172 | |
173 | static HRESULT OtherBindInterfered(/* in */ ApplicationContext *pApplicationContext, |
174 | /* in */ BindResult *pBindResult); |
175 | }; |
176 | }; |
177 | |
178 | #endif |
179 | |