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// Assembly.hpp
7//
8
9
10//
11// Defines the Assembly class
12//
13// ============================================================
14
15#ifndef __BINDER__ASSEMBLY_HPP__
16#define __BINDER__ASSEMBLY_HPP__
17
18#include "bindertypes.hpp"
19#include "assemblyname.hpp"
20
21#include "corpriv.h"
22#include "clrprivbinding.h"
23
24#include "clrprivbindercoreclr.h"
25
26#if !defined(DACCESS_COMPILE) && !defined(CROSSGEN_COMPILE)
27#include "clrprivbinderassemblyloadcontext.h"
28#endif // !defined(DACCESS_COMPILE) && !defined(CROSSGEN_COMPILE)
29
30STDAPI BinderAcquirePEImage(LPCTSTR szAssemblyPath,
31 PEImage **ppPEImage,
32 PEImage **ppNativeImage,
33 BOOL fExplicitBindToNativeImage);
34
35STDAPI BinderAcquireImport(PEImage *pPEImage,
36 IMDInternalImport **pIMetaDataAssemblyImport,
37 DWORD *pdwPAFlags,
38 BOOL bNativeImage);
39
40STDAPI BinderHasNativeHeader(PEImage *pPEImage,
41 BOOL *result);
42
43STDAPI BinderGetImagePath(PEImage *pPEImage,
44 SString &imagePath);
45
46STDAPI BinderReleasePEImage(PEImage *pPEImage);
47
48STDAPI BinderAddRefPEImage(PEImage *pPEImage);
49
50namespace BINDER_SPACE
51{
52
53 // An assembly represents a particular set of bits. However we extend this to
54 // also include whether those bits have precompiled information (NGEN). Thus
55 // and assembly knows whether it has an NGEN image or not.
56 //
57 // This allows us to preferentially use the NGEN image if it is available.
58 class Assembly
59 : public ICLRPrivAssembly
60 {
61 public:
62 // --------------------------------------------------------------------
63 // IUnknown methods
64 // --------------------------------------------------------------------
65 STDMETHOD(QueryInterface)(REFIID riid,
66 void ** ppv);
67 STDMETHOD_(ULONG, AddRef)();
68 STDMETHOD_(ULONG, Release)();
69
70 // --------------------------------------------------------------------
71 // ICLRPrivAssembly methods
72 // --------------------------------------------------------------------
73 LPCWSTR GetSimpleName();
74
75 STDMETHOD(BindAssemblyByName)(
76 IAssemblyName * pIAssemblyName,
77 ICLRPrivAssembly ** ppAssembly);
78
79 STDMETHOD(IsShareable)(BOOL * pbIsShareable);
80
81 STDMETHOD(GetAvailableImageTypes)(PDWORD pdwImageTypes);
82
83 STDMETHOD(GetImageResource)(
84 DWORD dwImageType,
85 DWORD *pdwImageType,
86 ICLRPrivResource ** ppIResource);
87
88 STDMETHOD(GetBinderID)(UINT_PTR *pBinderId);
89
90 STDMETHOD(GetLoaderAllocator)(LPVOID* pLoaderAllocator);
91
92 // --------------------------------------------------------------------
93 // Assembly methods
94 // --------------------------------------------------------------------
95 Assembly();
96 virtual ~Assembly();
97
98 HRESULT Init(/* in */ IMDInternalImport *pIMetaDataAssemblyImport,
99 /* in */ PEKIND PeKind,
100 /* in */ PEImage *pPEImage,
101 /* in */ PEImage *pPENativeImage,
102 /* in */ SString &assemblyPath,
103 /* in */ BOOL fInspectionOnly,
104 /* in */ BOOL fIsInGAC);
105
106 // Enumerates dependent assemblies
107 HRESULT GetNextAssemblyNameRef(/* in */ DWORD nIndex,
108 /* out */ AssemblyName **ppAssemblyName);
109
110 inline AssemblyName *GetAssemblyName(BOOL fAddRef = FALSE);
111 inline BOOL GetIsInGAC();
112 inline BOOL GetIsDynamicBind();
113 inline void SetIsDynamicBind(BOOL fIsDynamicBind);
114 inline BOOL GetIsByteArray();
115 inline void SetIsByteArray(BOOL fIsByteArray);
116 inline BOOL GetIsSharable();
117 inline void SetIsSharable(BOOL fIsSharable);
118 inline SString &GetPath();
119
120 inline PEImage *GetPEImage(BOOL fAddRef = FALSE);
121 inline PEImage *GetNativePEImage(BOOL fAddRef = FALSE);
122 inline PEImage *GetNativeOrILPEImage(BOOL fAddRef = FALSE);
123
124 HRESULT GetMVID(GUID *pMVID);
125
126 static PEKIND GetSystemArchitecture();
127 static BOOL IsValidArchitecture(PEKIND kArchitecture);
128
129 inline ICLRPrivBinder* GetBinder()
130 {
131 return m_pBinder;
132 }
133
134#ifndef CROSSGEN_COMPILE
135 protected:
136#endif
137 // Asssembly Flags
138 enum
139 {
140 FLAG_NONE = 0x00,
141 FLAG_INSPECTION_ONLY = 0x01,
142 FLAG_IS_IN_GAC = 0x02,
143 FLAG_IS_DYNAMIC_BIND = 0x04,
144 FLAG_IS_BYTE_ARRAY = 0x08,
145 FLAG_IS_SHARABLE = 0x10
146 };
147
148 inline void SetPEImage(PEImage *pPEImage);
149 inline void SetNativePEImage(PEImage *pNativePEImage);
150
151 inline void SetAssemblyName(AssemblyName *pAssemblyName,
152 BOOL fAddRef = TRUE);
153 inline BOOL GetInspectionOnly();
154 inline void SetInspectionOnly(BOOL fInspectionOnly);
155 inline void SetIsInGAC(BOOL fIsInGAC);
156
157 inline IMDInternalImport *GetMDImport();
158 inline void SetMDImport(IMDInternalImport *pMDImport);
159 inline mdAssembly *GetAssemblyRefTokens();
160
161 inline DWORD GetNbAssemblyRefTokens();
162 inline void SetNbAsssemblyRefTokens(DWORD dwCAssemblyRefTokens);
163
164 LONG m_cRef;
165 PEImage *m_pPEImage;
166 PEImage *m_pNativePEImage;
167 IMDInternalImport *m_pMDImport;
168 mdAssembly *m_pAssemblyRefTokens;
169 DWORD m_dwCAssemblyRefTokens;
170 AssemblyName *m_pAssemblyName;
171 SString m_assemblyPath;
172 DWORD m_dwAssemblyFlags;
173 ICLRPrivBinder *m_pBinder;
174
175 // Nested class used to implement ICLRPriv binder related interfaces
176 class CLRPrivResourceAssembly :
177 public ICLRPrivResource, public ICLRPrivResourceAssembly
178 {
179public:
180 STDMETHOD(QueryInterface)(REFIID riid, void ** ppv);
181 STDMETHOD_(ULONG, AddRef)();
182 STDMETHOD_(ULONG, Release)();
183 STDMETHOD(GetResourceType)(IID *pIID);
184 STDMETHOD(GetAssembly)(LPVOID *ppAssembly);
185 } m_clrPrivRes;
186
187 inline void SetBinder(ICLRPrivBinder *pBinder)
188 {
189 _ASSERTE(m_pBinder == NULL || m_pBinder == pBinder);
190 m_pBinder = pBinder;
191 }
192
193 friend class ::CLRPrivBinderCoreCLR;
194
195#if !defined(DACCESS_COMPILE) && !defined(CROSSGEN_COMPILE)
196 friend class ::CLRPrivBinderAssemblyLoadContext;
197#endif // !defined(DACCESS_COMPILE) && !defined(CROSSGEN_COMPILE)
198 };
199
200 // This is a fast version which goes around the COM interfaces and directly
201 // casts the interfaces and does't AddRef
202 inline BINDER_SPACE::Assembly * GetAssemblyFromPrivAssemblyFast(ICLRPrivAssembly *pPrivAssembly);
203
204#include "assembly.inl"
205};
206
207#endif
208